关于BigDecimal

Ara*_*rav 2 java string bigdecimal

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

当我做一个System.out.println(新BigDecimal(测试))我得到以下值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?

Mat*_*hen 5

System.out.println(new BigDecimal("58.15"));
Run Code Online (Sandbox Code Playgroud)

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

编辑:polygenelubricants是对的.具体来说,您使用的是Double.toString或等效的.从那里引用:

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只需要多少,更多的数字来唯一地区分参数值和double类型的相邻值.也就是说,假设x是由该方法为有限非零参数d生成的十进制表示所表示的精确数学值.那么d必须是最接近x的double值; 或者如果两个double值同样接近x,则d必须是其中之一,d的有效位的最低有效位必须为0.