<分区>
我猜这是由于 float 和准确性,但我只是想检查一下以确保没有遗漏任何其他内容。
我有一个 1007.62 的 float (存储在 info.Amount 中),它乘以 100 并转换为长整数。此时我得到的值为 100761。
这只是我们在应用 double 时遇到的旧舍入错误吗?我认为这可能发生的唯一方法是,如果它实际上存储为 1007.6199999999999(但出于显示目的四舍五入)。然后在乘法转换为 long 后忽略小数点后的所有内容?
标签 c#
<分区>
我猜这是由于 float 和准确性,但我只是想检查一下以确保没有遗漏任何其他内容。
我有一个 1007.62 的 float (存储在 info.Amount 中),它乘以 100 并转换为长整数。此时我得到的值为 100761。
这只是我们在应用 double 时遇到的旧舍入错误吗?我认为这可能发生的唯一方法是,如果它实际上存储为 1007.6199999999999(但出于显示目的四舍五入)。然后在乘法转换为 long 后忽略小数点后的所有内容?
最佳答案
您可以使用 Convert.ToInt64反而。这会产生正确的值。
LinqPad-测试代码:
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)
使用 CIL 指令 conv.i8
转换为 Int64,将 Int64 压入堆栈,而 Convert .ToInt64
使用 Math.Round(double)
转换/转换为 Int64。
关于conv.i8
的特别说明是
Conversion from floating-point numbers to integer values truncates the number toward zero.
关于c# - float 到 long 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22935564/