JAVA中BigDecimal的疑惑

问题描述

在做四舍五入的时候遇到个问题,如下代码块,得出的结果是5.55,ROUND_HALF_UP在API上不是讲---((向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。 ))为什么结果不是5.56?还请老鸟不吝啬赐教啊,谢谢了.BigDecimal b = new BigDecimal(5.555);b = b.setScale(2, BigDecimal.ROUND_HALF_UP);System.out.println(b); 问题补充:dk101 写道

解决方案

看到楼主的这个问题,我也很是惊讶,应该是输出“5.56”才对的呀,怎么会是“5.55”呢?不相信之余,将代码运行了一次,结果真是“5.55”。我想这个问题的原因应该是处在创建对象b时,就这个代码“new BigDecimal(5.555); ”,我将其改成“new BigDecimal("5.555");”后,输出结果为“5.56”。不明白个中原因,只好查看API文档,原来是这样(下面是从API文档中拷贝的解释):BigDecimalpublic BigDecimal(double val)将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。 注: 此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。 当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。 参数:val - 要转换为 BigDecimal 的 double 值。 抛出: NumberFormatException - 如果 val 为无穷大或 NaN。原因是,“此构造方法的结果有一定的不可预知性”,还真是憋闷,不知我的理解对否,请楼主参考。
解决方案二:
可以去学习一下httpclient 比较好的文章http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html
解决方案三:
这个。。。5.555约等于5.554999999999999999999999999

时间: 2024-09-11 12:52:02

JAVA中BigDecimal的疑惑的相关文章

java中BigDecimal的应用

  我们来看一看java中BigDecimal的用法   public class MathUtil { // 加法 public static Double add(double a,double b,int scal) throws Exception{     BigDecimal add1 = conversionToBigDecimal(a);     BigDecimal add2 = conversionToBigDecimal(b);     Double result = ad

Java中BigDecimal类的简单用法_java

本文实例讲述了Java中BigDecimal类的简单用法,是Java程序设计中非常实用的技巧,分享给大家供大家参考.具体用法分析如下: 一般来说,一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算.但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾.BigDecimal类位于java.maths类包下.首先我们来看下如何构造一个BigDecimal对象.它的构造函数很多,

浅谈java中BigDecimal的equals与compareTo的区别_java

这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都是以sun jdk 1.4.2版本为例,其他版本实现未必一致,请忽略] 首先看一下BigDecimal的equals方法: public boolean equals(Object x){ if (!(x instanceof BigDecimal)) return false; BigDecima

java中BigDecimal的操作方法_java

本文实例讲述了java中BigDecimal的操作方法.分享给大家供大家参考.具体分析如下: 由于double,float的精度不够,因此在进行商业计算的时候要使用的BigDecimal.BigDecimal对象创建如下: 复制代码 代码如下: BigDecimal b = new BigDecimal("12.000001"); System.out.println(b); 输出结果为:12.000001: BigDecimal在创建的时候可以传入String和double,但是最好

java中BigDecimal进行加减乘除的基本用法_java

前言 众所周知Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal. BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是B

Java中使用BigDecimal进行浮点数运算_java

最近研究了一下Java的浮点数计算问题,从网上查询了相关的资料,汇总并经过了一些整理和调试,最后完成此文,欢迎大家指出其中的错误和问题. 在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍.float是4个字节而double是8个字节.float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算.大家可以通过下面代码可以看出来: 复制代码 代码如下: p

Java中精确计算的一个类用BigDecimal

这个类确实好用.在网上找到大的,是一个女Java程序员写的.厉害~~~~~~哈哈/* * 创建日期 2004-10-14 * * 如果需要精确计算,非要用String来够造BigDecimal不可 */package com.lims.actions.testqc.comm; /** * @author Jstar * * * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */import java.math.BigDecimal; /*** 由于Java的简单类型

java中string转bigdecimal的例子

例子1,string 转BigDecimal public class Test{     public static void main(String[] arg) {         String str1="2.30";         BigDecimal bd=new BigDecimal(str1);         System.out.println(bd);     } } 直接new  就行了. 例子2,BigDecimal和String的相互转换 /*由数字字符串

Java中float,double为什么会丢失精度。

Effective Java Item 48: Avoid float and double if exact answers are required  对于精确计算不提倡使用float,double,因为会丢失精度,这是为什么呢? 让我细细说来 1. 什么是浮点数? 表示一个数字如100.2,可以是Fixed point也就是100.2,也可以是Floating point(也就是科学计数法scientific notation)1.002 ×  102.通常是以第一个非零数字作为小数点前的