谁能向我解释一下这里发生了什么:
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(使用前将#替换为@)