将值加倍以长时间更改值

问题描述 投票:0回答:2

我注意到,当要转换的数字很大时,即使它远低于Long的最大值,从double到long的转换也会改变该值。例如,有人可以向我解释为什么这种转换无法按预期进行吗:

Convert.ToInt64(600000000000040000d)
// Return => 600000000000039936
Convert.ToInt64(600000000000040000L)
// Return => 600000000000040000

这给我的公式带来了麻烦...谢谢。

c# type-conversion double
2个回答
2
投票

Well,double具有尾数52(有关详细信息,请参见https://en.wikipedia.org/wiki/Double-precision_floating-point_format);这就是double可以表示最多2**53 - 1 == 9007199254740991precise整数值的原因。但是,

 600000000000040000 > 9007199254740991

这就是为什么舍入错误不可避免:

  double d = 600000000000040000d;

  long l = (long)d;

  double d2 = l;

  Console.WriteLine($"{d:r} : {l} : ({d == d2 ? "Equal" : "Different})");

结果:

  6.0000000000004E+17 600000000000039936 : Equal

1
投票

我希望这会有所帮助:

将双精度或浮点型值转换为整数类型时,该值将朝四舍五入到最接近的整数值。如果结果积分值超出目标类型的范围,则结果取决于溢出检查上下文。在已检查的上下文中,将引发OverflowException,而在未检查的上下文中,结果将是目标类型的未指定值。

来源:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/explicit-numeric-conversions-table

注意:Long是整数类型,它是Int64:In C# What's the difference between Int64 and long?

此外,float和double是带浮点的类型。它们以不同的方式存储在内存中How are floating point numbers stored in memory?

维基百科:https://en.wikipedia.org/wiki/Single-precision_floating-point_format

© www.soinside.com 2019 - 2024. All rights reserved.