我在这里添加三个大小数,但它应该给我准确的答案.我在这里有两个字符串,然后转换为大十进制.请不要问为什么我使用字符串.有一些业务,我将这些值作为字符串,然后我需要转换.请找到代码
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
问题是你的使用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
使用Double.toString(double)
方法提供的double的规范字符串表示将double转换为a .注意:这通常是将
double
(或float
)转换为a的首选方法BigDecimal
,因为返回的值等于BigDecimal
从using结果中构造a 所产生的值Double.toString(double)
.
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
可以正确处理.
归档时间: |
|
查看次数: |
478 次 |
最近记录: |