为什么我需要用 Math.floor 做浮点运算
Why do I need to do floating point arithmetic with Math.floor
为什么:
Console.WriteLine(Math.Floor(128.766*1000));
产生不同的结果:
Console.WriteLine(Math.Floor((decimal)128.766*1000));
无论是使用整数还是小数,正确答案肯定是 128766。 (例如,我熟悉转换为小数以进行除法。)
我正在使用 .NET 4.5 C#
第一行使用浮点数学,这是不准确的。 128.766*1000
可能计算为 128765.99999999999
或类似的东西。
Math.Floor
四舍五入成为 128765
.
然而,在第二行中,您先将结果转换为 decimal
,然后再 Math.Floor
。转换为十进制消除了这种不准确性,因为 decimal
是 128 位并且范围更小。有关详细信息,请参阅 here。当您将 128765.9999999999
转换为 decimal
时,它变成了 128766
.
为什么:
Console.WriteLine(Math.Floor(128.766*1000));
产生不同的结果:
Console.WriteLine(Math.Floor((decimal)128.766*1000));
无论是使用整数还是小数,正确答案肯定是 128766。 (例如,我熟悉转换为小数以进行除法。)
我正在使用 .NET 4.5 C#
第一行使用浮点数学,这是不准确的。 128.766*1000
可能计算为 128765.99999999999
或类似的东西。
Math.Floor
四舍五入成为 128765
.
然而,在第二行中,您先将结果转换为 decimal
,然后再 Math.Floor
。转换为十进制消除了这种不准确性,因为 decimal
是 128 位并且范围更小。有关详细信息,请参阅 here。当您将 128765.9999999999
转换为 decimal
时,它变成了 128766
.