c# - float 到 long 转换错误

标签 c#

<分区>

我猜这是由于 float 和准确性,但我只是想检查一下以确保没有遗漏任何其他内容。

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

enter image description here

这只是我们在应用 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/

相关文章:

c# - 如何编写单元测试以确定对象是否可以被垃圾回收?

c# - 是否可以有条件地序列化 CDATA?

c# - 如何在 WCF 服务中使用角色管理器?

c# - 预览文档后选择打印机

C# 可空整数 - 编译错误

c# - 了解.NET中的垃圾收集

c# - 带有 Autofac 的 ASP.NET MVC3 Bootstrap

c# - WPF C# DataGrid 编辑单元格

c# - 获取在应用程序域中启动的进程的程序集名称

用于定时操作的 C# 库