Java 模不';行不通

Java 模不';行不通,java,modulo,Java,Modulo,我知道这似乎是一个非常愚蠢的问题,但我不明白为什么这不起作用。这: System.out.println(5 % .10); 它又回来了: 0.09999999999999973 我真的不知道。我只是在学习Java,而且我对C很在行,所以我试着用C#to。C#似乎也返回同样的结果。您正在执行浮点运算。0.1没有精确的浮点表示。这是由于浮点精度0.10不能用二进制精确表示。因此,结果不完全是0.10,因此没有被修改为0 这将适用于0.25,因为0.25可以用二进制准确表示 编辑: 通常,任何

我知道这似乎是一个非常愚蠢的问题,但我不明白为什么这不起作用。这:

 System.out.println(5 % .10);
它又回来了:

0.09999999999999973

我真的不知道。我只是在学习Java,而且我对C很在行,所以我试着用C#to。C#似乎也返回同样的结果。

您正在执行浮点运算。0.1没有精确的浮点表示。

这是由于浮点精度<代码>0.10不能用二进制精确表示。因此,结果不完全是
0.10
,因此没有被修改为
0

这将适用于
0.25
,因为
0.25
可以用二进制准确表示

编辑:


通常,任何可以表示为分母幂为2的分数的数字都可以用IEEE浮点精确表示。(前提是不溢出/下溢)

Java(与除COBOL之外的大多数编程语言一样)正在二进制系统中进行计算。我认为0.10有这样一个不吉利的二进制表示形式,以至于您的计算结果如下所示。我认为最好避免计算double或float的模,坚持整数或long以获得更好的结果。

正如其他人所解释的,这是由于浮点精度造成的不准确

在这种情况下,您应该使用用于包含小数的精确算术

BigDecimal number = new BigDecimal(5);
BigDecimal divisor = new BigDecimal("0.1");
BigDecimal result = number.remainder(divisor);
System.out.println(result); // 0

0.1的二进制表示形式为

System.out.println(new BigDecimal(0.1));
印刷品

0.1000000000000000055511151231257827021181583404541015625
打印0.1时,会得到少量舍入,从而隐藏此错误

执行计算时,必须使用BigDecimal或四舍五入结果,或转换计算以最大限度地减少误差

5 % 0.1
(5 / 0.1 % 1) * 0.1
50 % 1 / 10
就双倍而言,你可以做到

double d = 5;
double mod0_1 = d * 10 % 1 / 10;
double rounded = Math.round(mod0_1 * 1e12)/1e12; // round to 12 places.

注意:结果仍然可能有轻微的错误,但它将足够小,当您打印它时,您将看不到它。

您的意思不是很肯定,但它似乎适用于其他浮动。如果我执行“System.out.println(5%.25);”命令,它将返回0。谢谢:)他说的正是他的意思。0.1不能用IEEE-754浮点表示。这是一个经典的计算机科学问题。0.25可以表示,因为它是2的幂(2^-2)。@sh042067:这是因为0.25是1/4,可以在数字计算机上精确表示。谷歌关于浮点数的数字表示。这不是Java的问题,而是数字计算机的问题。浮点之间的模是什么?你认为它应该返回什么…@Shahzeb他可能期望0,因为0.1除以5。模没有被破坏。但是,可以肯定的是,您对模和浮点表示法都有误解。那么,我该如何获得.10的模呢?只需将5乘以100和.10乘以100?你可以将5乘以10,将mod乘以1。然后将结果除以10。