关于BigDecimal

时间:2010-03-09 02:11:08

标签: java string bigdecimal

我为这个双变量执行以下java print命令 双重测试= 58.15; 当我做一个System.out.println(测试);和System.out.println(new Double(test).toString());打印为58.15。

当我执行System.out.println(new BigDecimal(test))时,我得到以下值 58.14999999999999857891452847979962825775146484375

我能理解“test”双变量值在内部存储为58.1499999。但是,当我执行以下两个System.out.println时,我得到的输出为58.15而不是58.1499999。

的System.out.println(测试);

System.out.println(new Double(test).toString());

上面两个输出打印输出为58.15。

上面的System.out.println语句是否正在对值58.1499999进行一些舍入并将其打印为58.15?

3 个答案:

答案 0 :(得分:5)

System.out.println(new BigDecimal("58.15"));

要从硬编码常量构造BigDecimal,必须始终使用类中的常量之一(ZEROONETEN)或其中一个字符串构造函数。原因是你把一个值放在一个双精度值中,你已经失去了永远无法恢复的精度。

编辑:polygenelubricants是对的。具体来说,您使用的是Double.toString或同等版本。引用那里:

  

必须打印多少位数   m或a的小数部分?那里   必须至少有一位数   代表小数部分,和   超越那么多,但只有那么多,   唯一需要的更多数字   区分参数值   double类型的相邻值。那   是,假设x是确切的   以数学为代表的数学价值   十进制表示由   这种方法适用于有限非零   论证d。那么d必须是双倍的   最接近x的值;或者两个加倍   值等于x,然后是d   必须是其中之一,而且至少是其中之一   重要的有意义的   d必须为0.

答案 1 :(得分:3)

是的,println(或更确切地说,Double.toString)轮次。为了证明,System.out.println(.1D);打印0.1,这是不可能用二进制表示的。

此外,使用BigDecimal时,请勿使用double构造函数,因为这会尝试精确表示不精确的值。改为使用String构造函数。

答案 2 :(得分:1)

out.printlnDouble.toString()使用Double.toString(double)中指定的格式。

默认情况下,BigDecimal使用更高的精度,如javadoc中所述,当您调用toString()时,它会输出所有字符,直到原始双精度可用的精度级别,因为.15不有一个确切的二进制表示。