【问题标题】:C# float to double conversionC#浮点到双精度转换
【发布时间】:2020-01-16 05:41:46
【问题描述】:

当我执行以下除法并转换为浮点数时,我得到以下值:

float fltval = (float)(1183588296 / 65536.0);   //18060.125

在没有强制转换的情况下执行相同的除法得到以下双精度值:

double dblval = 1183588296 / 65536.0;   //18060.124145507813

我可以找到给定浮点值最接近的双精度值吗?

当我执行以下操作时:

double nearestdbl = (double)fltval;

我得到的是浮点值本身,而不是最接近的双精度值:

//nearestdbl = 18060.125

在这种情况下,如何获得更准确的值 (18060.124145507813) 或更接近的值?

我希望能够将结果存储在 32 位(浮点数)中,并且仍然能够通过将浮点值分配给双精度变量来得出更接近的双精度值。

但是,下面的代码给出了更准确的双精度值:

float f = 125.32f;  //125.32
double d = (double)125.32f; //125.31999969482422

为什么它在第二个例子中找到了更接近的值,而不是在第一个例子中?

谢谢。

【问题讨论】:

  • 在一张纸上写下“18060.124145507813”。撕下这张纸,去掉“4145507813”部分。把它写在另一张纸上,并请其他人为你恢复小数点后 11 位(不要给他们原始计算)。这就是您希望计算机可以为您做的事情。
  • 你好像没有理解Rounding的概念,它不是无损的,不可逆的。另外,如果您可以从 32 位恢复它,为什么还要存在 64 位表示?无论哪种方式,这都不是结论性的。

标签: c# floating-point double precision division


【解决方案1】:

(实际上,当我运行代码时,我得到的是18060.13 而不是18060.125,但我会继续在我的回答中使用后者。)

对于给定的浮点值,我能否找到最接近的双精度值?

您似乎以某种方式认为浮点 18060.125 最接近的双精度值是 18060.124145507813?这不是真的。浮点 18060.125 最接近的双精度值是 18060.125。这个值可以用doublefloat同样准确地表示。

那么为什么将18060.124145507813 转换为float 会得到18060.125

因为与double 18060.124145507813 最接近的float18060.125。请注意,这与您的理解相反。这并不意味着与float 18060.125 最接近的double18060.124145507813,因为在两个相邻的float 值之间有许多double 值。

不可能返回到“您从中获得floatdouble”,因为当您转换为float 时,您将丢失信息。您正在从 64 位值转换为 32 位值。那个信息是不会回来的。

那么为什么投射 125.32f 有效?

因为float 不能像double 那样准确地表示数字 125.32,所以当您转换为 double 时,它​​会尝试进一步逼近它。虽然看起来float 可以 100% 准确地表示125.32,但这只是ToString 方法造成的错觉。始终使用某种格式化方法格式化您的浮点数,例如string.Format.

【讨论】:

    【解决方案2】:

    在转换数据类型时,您总是会得到精度较低的类型... 考虑int转double时的情况

    int intVal = (int)(10.0/4);
    double dblVal = 10.0/4;
    //dblVal = 2.5 --- intVal = 2
    dblVal = intVal;
    //dblVal = 2.00;
    

    底线: 不能同时节省内存和精度……

    【讨论】:

      【解决方案3】:

      当您将 double 转换为 float 时,double 值会四舍五入到最接近的 float 值。如果双精度值太小或太大而无法放入浮点类型,则结果为零或无穷大。 看看这个链接: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 2018-04-26
        相关资源
        最近更新 更多