如果JavaScript的Number和C#的double被指定为相同的(IEEE 754), 为什么具有许多有效数字的数字会被不同地处理?
同一个变量因为值不同而打印出不同的字符串。
var x = (long)1234123412341234123.0; // 1234123412341234176 - C#
var x = 1234123412341234123.0; // 1234123412341234200 - JavaScript
我并不关心IEEE 754不能表示数字1234123412341234123的事实。我关心的是对于无法完全精确表示的数字,两个实现的行为不同。
这可能是因为IEEE 754规范不够明确,其中一个或两个实现有误,或者它们实现了不同的IEEE 754变体。
这个问题与C#中浮点输出格式化的问题无关。我正在输出64位整数。请考虑以下内容:
long x = 1234123412341234123;
Console.WriteLine(x); // Prints 1234123412341234123
double y = 1234123412341234123;
x = Convert.ToInt64(y);
Console.WriteLine(x); // Prints 1234123412341234176
同一个变量因为值不同而打印出不同的字符串。
(1234123412341234123.0).ToString("F")
可以更准确地展示这个问题(输出1234123412341230000.00
)。但正如 这个回答 所描述的,C# 会先将数字四舍五入到15位有效数字。 - Sayse(1234123412341234123.0).ToString("G17")
(https://ideone.com/xdfQD6)。是F
格式化程序出了问题。 - xanatos