我猜这是由于浮点和准确性,但我只是想检查一下,确保没有别的东西我错过了。
我有一个1007.62的浮点数(存储在info.Amount中),它乘以100并转换为长整数。此时我得到的值为100761。
这是否是我们遇到双打应用时遇到的旧的舍入错误?我认为可能发生这种情况的唯一方法是在它下面实际存储为1007.6199999999999(但为了显示目的而舍入)。然后在乘法之后,转换为long会忽略小数点后的所有内容吗?
答案 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是一个双重数字,不应该存储为浮点数,这可能会导致您的情况等进一步的问题。