Java模数与双重

时间:2015-02-03 06:22:00

标签: java double modulus

所以我正在使用一些模数,我很困惑为什么当我做

 .3%.1  

我得到了

0.09999999999999998 

而不是0 ...我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

考虑BigDecimal

  

不可变,任意精度的有符号十进制数。

这样可以准确表示您的值。它与floating point values is because they aren't exact无法正常工作的原因(正如您所期望的那样)。

所以使用BigDecimal API,

BigDecimal n1 = new BigDecimal("0.3");
BigDecimal n2 = new BigDecimal("0.1");
BigDecimal r = n1.remainder(n2);
System.out.println(r);

输出:

0.0

答案 1 :(得分:0)

最接近0.03的两倍是0.0299999999999999988897769753748434595763683319091796875,最接近0.01的两倍是0.01000000000000000020816681711721685132943093776702880859375

略微小于0.03模数稍微大于0.01的东西必须导致值略小于0.01。

没有精确浮点表示的数字同样可能由稍微小或稍微大的东西表示。这可以很好地进行舍入,但是对于地板,天花板和类似操作(包括模数)会产生不方便的结果,其中差异较小的值的处理方式非常不同。

如前所述,如果精确处理小数部分特别重要,请使用BigDecimal或以10的幂进行缩放并执行整数运算。否则,请提供有关模运算的上下文和原因的更多信息。

答案 2 :(得分:-1)

你可以尝试这个 - :

  System.out.println((int)(.3%.1));

这会将o/p打印为0

原因是因为您正在进行浮点运算,结果是浮点数。