C# 为什么我需要用Math.floor做浮点运算

C# 为什么我需要用Math.floor做浮点运算,c#,.net-4.5,C#,.net 4.5,为什么: 控制台写入线(数学层(128.766*1000)) 产生不同的结果: Console.WriteLine(数学层((十进制)128.766*1000)) 不管是整数还是小数,正确答案肯定是128766。(例如,我熟悉十进制除法。) 我使用的是.NET 4.5 C 35;第一行使用浮点数学,这是不准确的128.766*1000可能计算为128765.999999999或类似值 Math.Floor将其向下舍入为128765 但是,在第二行中,您首先将结果转换为decimal,然后是Mat

为什么: 控制台写入线(数学层(128.766*1000))

产生不同的结果:

Console.WriteLine(数学层((十进制)128.766*1000))

不管是整数还是小数,正确答案肯定是128766。(例如,我熟悉十进制除法。)


我使用的是.NET 4.5 C 35;

第一行使用浮点数学,这是不准确的
128.766*1000
可能计算为
128765.999999999
或类似值

Math.Floor
将其向下舍入为
128765


但是,在第二行中,您首先将结果转换为
decimal
,然后是
Math.Floor
。转换为十进制可以消除这种不精确性,因为
十进制
为128位,范围较小。有关更多信息,请参阅。当您将
128765.9999999999
转换为
decimal
时,它会变成
128766

。读这个。一个Маth.Floor返回十进制,另一个double,这就是原因。运行此命令可以提示正在发生的事情:
decimal
本身就是一种浮点类型,并且通常确实存在与所有浮点类型相同的不准确问题。只是OP的值可以精确地表示出来。