任何人都可以向我解释这里发生了什么:
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})
1000000.123f将以f存储为1000000.125(IEEE754近似为32位?)
双倍也将存储1000000.125(即使f似乎不包含我的预期,似乎也会发生)
要求在ToString上使用往返格式会在两种情况下都返回1000000.125。
任何人都可以告诉我在输出f?
时输入1000000.13我做错了什么答案 0 :(得分:5)
如您所见,数字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位数表示。这是不正确的。