Bigdecimal不提供Java中的确切输出

Yak*_*oob -1 java

我在这里添加三个大小数,但它应该给我准确的答案.我在这里有两个字符串,然后转换为大十进制.请不要问为什么我使用字符串.有一些业务,我将这些值作为字符串,然后我需要转换.请找到代码

BigDecimal a= new BigDecimal(100.05); --> This value I receive from web service. Its a decimal value from the service. 
    String b= "100.05";
    String c= "200.03";
    System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c))));
Run Code Online (Sandbox Code Playgroud)

它给出的输出

400.1299999999999971578290569595992565155029296875

它应该是400.13

Jon*_*eet 7

问题是你的使用new BigDecimal(100.05).a那么值是100.0499999999999971578290569595992565155029296875.

如果您已将该值指定为字符串,那么一切都会很好:

BigDecimal a = new BigDecimal("100.05");
String b = "100.05";
String c = "200.03";
System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c))));
// Output: 400.13
Run Code Online (Sandbox Code Playgroud)

如果您将输入作为a double,则可以使用BigDecimal.valueOf(double)而不是调用构造函数:

BigDecimal a = BigDecimal.valueOf(100.05); // a is now exactly 100.05
Run Code Online (Sandbox Code Playgroud)

比较BigDecimal(double)文档:

将double转换为BigDecimal,它是double的二进制浮点值的精确十进制表示形式.(......)

随着BigDecimal.valueOf(Double):

BigDecimal使用Double.toString(double)方法提供的double的规范字符串表示将double转换为a .

注意:这通常是将double(或float)转换为a的首选方法BigDecimal,因为返回的值等于BigDecimal从using结果中构造a 所产生的值Double.toString(double).


Rom*_*kiy 5

new BigDecimal(100.05)
Run Code Online (Sandbox Code Playgroud)

这给出了100.0499999999999971578290569595992565155029296875,因为100.05不能完全表示为a double.

你也必须在这里使用字符串:

new BigDecimal("100.05")
Run Code Online (Sandbox Code Playgroud)

当您从Web服务获得此值时,您可能将其从a String转换为float/ double.如果是这种情况,请跳过该转换步骤.

如果您的Web服务存根将返回值映射到float/ double,您可以考虑String直接将其映射到a ,然后将其提供给BigDecimal构造函数,如下所示:

double v = 100.05; // Value from web service
BigDecimal a= new BigDecimal(String.valueOf(v));
String b= "100.05";
String c= "200.03";
System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c))));
Run Code Online (Sandbox Code Playgroud)

实例

这是有效的,因为字符串只包含所需的数字,以区分几乎100.05的值与可以表示的任何一侧的下一个值,因此我们得到字符串"100.05",然后BigDecimal可以正确处理.