java - BigDecimal 到 double 的转换

标签 java math floating-point precision bigdecimal

将 BigDecimal 转换为 double 时,会添加额外的精度。 你能建议这个吗? 例如:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);

并且值打印- 1.23456789123456992E17。为什么最后一个数字 7 会转换为 6992?有什么方法可以获得转换为 double 后传递给 BigDecimal 的相同输入吗?

最佳答案

有一些有用的方法 Math.nextUp()Math.nextDown() 可以帮助您调查此问题:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);
System.out.println(Math.nextDown(value));
System.out.println(Math.nextUp(value));

输出为:

1.23456789123456992E17
1.23456789123456976E17
1.23456789123457008E17

如您所见,双数 ...456976 后面紧跟着 ...456992,而 ...456992 后面紧接着是 。 ..457008。因此,BigDecimal.doubleValue() 应在两个最接近的数字 ...456992...457008 之间进行选择。他们之间不存在其他双数。

实际上,您甚至不需要 BigDecimal 来进行此测试:

double value = 1.23456789123457E+17;
System.out.println(value); // prints 1.23456789123456992E17

关于java - BigDecimal 到 double 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29104038/

相关文章:

c++ - 在 C++ 中创建 n 个项目的所有可能的 k 个组合

c# - 在 C# 中将 double 乘以 100 会导致意想不到的答案

c - 浮点运算和机器 epsilon

java - 在 Restful 服务中获取 HttpServletResponse Null

java - 从 java 运行 shell 脚本

java多线程与可运行接口(interface)

java - 适用于 Java、git 和 vim 的 Netbeans 7 与 Eclipse 3.6

javascript - 简单的 Javascript 数学函数 - 加法/不起作用?

java - 字符串的两半就地交错

c++ - 如何在特定机器上找到尾数长度?