Aar*_*lla 18
如果您需要精确的结果,请使用精确类型:
double val = 3.9 - (3.9 % 0.1);
System.out.println(val); // 3.8000000000000003
BigDecimal x = new BigDecimal( "3.9" );
BigDecimal bdVal = x.subtract( x.remainder( new BigDecimal( "0.1" ) ) );
System.out.println(bdVal); // 3.9
Run Code Online (Sandbox Code Playgroud)
为什么3.8000 ... 003?因为Java使用FPU来计算结果.3.9不可能完全以IEEE双精度表示法存储,因此它存储3.89999 ...而不是.3.8999%0.01给出0.09999 ...因此结果略大于3.8.
来自Java 语言规范:
% 运算符计算的浮点余数运算的结果与 IEEE 754 定义的余数运算产生的结果不同。 IEEE 754 余数运算通过舍入除法而不是截断除法计算余数,并且所以它的行为与通常的整数余数运算符的行为不同。相反,Java 编程语言在浮点运算上定义 % 以类似于整数余数运算符的方式运行;这可以与 C 库函数 fmod 进行比较。IEEE 754 余数运算可由库例程 Math.IEEEremainder 计算。
换句话说,这是由于 Java 对计算余数所涉及的除法结果进行四舍五入,而 IEEE754 指定截断除法的结果。这个特殊案例似乎非常清楚地暴露了这种差异。
您可以使用 Math.IEEEremainder 得到您期望的答案:
System.out.println(3.9 - (3.9 % 0.1));
System.out.println(3.9 - Math.IEEEremainder(3.9, 0.1));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16938 次 |
| 最近记录: |