浮点到长转换时出错

时间:2014-04-08 11:26:09

标签: c#

我猜这是由于浮点和准确性,但我只是想检查一下,确保没有别的东西我错过了。

我有一个1007.62的浮点数(存储在info.Amount中),它乘以100并转换为长整数。此时我得到的值为100761。

enter image description here

这是否是我们遇到双打应用时遇到的旧的舍入错误?我认为可能发生这种情况的唯一方法是在它下面实际存储为1007.6199999999999(但为了显示目的而舍入)。然后在乘法之后,转换为long会忽略小数点后的所有内容吗?

2 个答案:

答案 0 :(得分:3)

您可以改用Convert.ToInt64。这会产生正确的值。

LinqPad-Testcode:

float z = 1007.62f;
z.Dump();

float x = z *100;
x.Dump();

long l = (long) (z*100);
l.Dump();

l = Convert.ToInt64(z*100);
l.Dump();

l = Convert.ToInt64(x);
l.Dump();

结果是:

1007,62
100762
100761
100762
100762

强制转换(long) (z*100)使用转换为Int64的CIL指令conv.i8,在堆栈上推送Int64,而Convert.ToInt64使用Math.Round(double)转换/强制转换为Int64。 / p>

关于conv.i8的特别说明是

  

从浮点数转换为整数值会截断   数字朝零。

答案 1 :(得分:1)

实际上我认为这是由于您可能宣布的变量。

采取以下示例:

       double amount = 1007.62;
       long result = (long) (amount*100);

结果绝对是100762,没有任何分数或圆度。事实上,1007.62是一个双重数字,不应该存储为浮点数,这可能会导致您的情况等进一步的问题。