我为这个双变量执行以下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?
答案 0 :(得分:5)
System.out.println(new BigDecimal("58.15"));
要从硬编码常量构造BigDecimal,必须始终使用类中的常量之一(ZERO,ONE或TEN)或其中一个字符串构造函数。原因是你把一个值放在一个双精度值中,你已经失去了永远无法恢复的精度。
编辑: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.println
和Double.toString()
使用Double.toString(double)中指定的格式。
默认情况下,BigDecimal使用更高的精度,如javadoc中所述,当您调用toString()
时,它会输出所有字符,直到原始双精度可用的精度级别,因为.15不有一个确切的二进制表示。