【问题标题】:How to get back original value(real number) from floats value without including exponential notation in c#?如何从浮点值取回原始值(实数)而不在c#中包含指数符号?
【发布时间】:2019-02-06 12:34:00
【问题描述】:

我刚刚将 16 位数字转换为 float 值。

 float myVal =(float) 4447962230071312;
Console.WriteLine(myVal);

这给出了输出: 4.44796223007131E+15

我试过下面的代码,

long originalVal = (long)myVal;
Console.WriteLine(originalVal);

这给出了输出: 4447962352582656

Console.WriteLine(myVal.ToString("0.#########"));

这给出了输出: 4447962000000000

既然,如何取回4447962230071312

的原始值

【问题讨论】:

  • float (Single) 使用 23 位作为小数部分。因此,2**24 - 1 == 16777215 之外的整数将被四舍五入,并且不可避免地会出现四舍五入错误
  • 有什么代码可以解决这个问题吗?什么都没有!
  • 您可以尝试将52位长小数部分更改为double(最多9007199254740991,恰好大于4447962230071312
  • 你可以使用decimal类型
  • 为什么要把它转换成float呢?只需将其保留为 long

标签: c# floating-point


【解决方案1】:

float(或Single)仅将23 位用于小数部分,因此Single 可以表示整数值没有舍入误差

2**(23 + 1) - 1 == 16777215

你可以切换到double,它有52位小数部分,因此可以表示整数值

2**(52 + 1) - 1 == 9007199254740991 > 4447962230071312

详情见

https://en.wikipedia.org/wiki/Single-precision_floating-point_format https://en.wikipedia.org/wiki/Double-precision_floating-point_format

代码:

  double myVal = 4447962230071312.0;

  long originalVal = (long)myVal;

【讨论】:

  • 你的解释很好。但是,我遇到了similar 问题。这就是为什么我用这个实数进行测试的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2013-03-19
  • 2019-08-19
相关资源
最近更新 更多