C# 浮点精度

2024-03-23

谁能向我解释一下这里发生了什么:

using System;
using System.Text;

namespace ConsoleApplication1 {

    class Program {

        static void Main(string[] args) {

            object o = 1000000.123f;
            float f= Convert.ToSingle(o);
            double d = Convert.ToDouble(f);

            Console.WriteLine(f.ToString("r"));
            Console.WriteLine(d.ToString("r"));

            Console.ReadLine();

        }
    }
}

哪个输出:

1000000.13

1000000.125

我期望:

对象 o 具有底层 float 类型(似乎发生了[通过观察其键入为 object {float} 的监视窗口)

1000000.123f 将作为 1000000.125 存储在 f 中(32 位的 IEEE754 近似值?)

double 也会存储 1000000.125 (即使 f 似乎不包含我所期望的内容,似乎也会发生)

在这两种情况下,要求 ToString 上的往返格式都会返回 1000000.125。

谁能告诉我在串出 f 时得到 1000000.13 时我做错了什么?


正如您已经观察到的,数字 1000000.123 存储为 1000000.125。这是按原样呈现的double.ToString(),但被截断为float.ToString()因为显示太多数字会产生误导。

顺便说一句,没有Convert.ToSingle(float)因为它只会返回您传入的内容。您的代码实际上解析为Convert.ToSingle(double)。因此,您(隐式)转换为double然后(明确地)回到float,本质上这是一个空操作。

注意:不要相信 JavaScript 浮点计算器。他们中的一些人声称 1000000.123 通过单精度浮点数存储为 1000000.1,我猜测这是基于这样的假设:由于 IEEE 浮点数大约有 7.22 位精度,因此它们可以准确地用 8 位表示。这是不正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 浮点精度 的相关文章

随机推荐