正如问题所暗示的(更像是一个声明,抱歉),我在C#中使用math.truncate时遇到了问题。我想说的是,当一个数字的十进制数除以50等于0.4时,这样做:
double temp2 = 170;
temp2 = temp2 / 50; //this equals 3.4
temp2 -= Math.Truncate(temp2);
if (temp2 == 0.4)
{
Console.WriteLine("Hello");
}然而,当我尝试这样做时,它对我来说不起作用,我不确定为什么它不起作用,我能得到一些关于这一点的解释,并将我带到正确的方向吗?
发布于 2013-09-06 10:42:24
single和double是二进制浮点类型。这意味着它们不能精确地表示许多十进制值(如0.4)。这可能会导致细微的舍入错误,因此比较逻辑上应该表示相同值的两个double值可能会导致意外的结果。
这可以使用DoubleToInt64Bits方法进行经验验证:
BitConverter.DoubleToInt64Bits(temp2); // 4600877379321698712
BitConverter.DoubleToInt64Bits(0.4); // 4600877379321698714将其更改为decimal,您将获得预期的结果:
decimal temp2 = 170;
temp2 = temp2 / 50; //this equals 3.4
temp2 -= Math.Truncate(temp2);
if (temp2 == 0.4m) // the m creates a decimal constant
{
Console.WriteLine("Hello");
}发布于 2013-09-07 23:02:33
当你减去浮点数中最重要的部分时,因为与被减数相比,减法结果具有较小的幅度,所以在该结果中存在许多额外的“人工”精度。由于原始数字没有精确表示(二进制浮点几乎总是如此),这种额外的精度看起来就像垃圾。
举一个更极端的例子(原则上是一样的):
double x = 987654321098.4 - 987654321098.0;
// x becomes 0.4000244140625在这里,数量级发生了很大变化。在原始示例中:
3.4 - 3.0结果,大约。0.4,仍然不到约八分之一。3.4,所以这里有三个额外的精度。
https://stackoverflow.com/questions/18649020
复制相似问题