为什么在C#和JavaScript中处理具有许多有效数字的数字会有所不同?

Han*_*rbe 8 javascript c# ieee-754

如果JavaScript的Number和C#的double指定相同(IEEE 754),为什么具有许多有效数字的数字处理不同?

var x = (long)1234123412341234123.0; // 1234123412341234176   - C#
var x =       1234123412341234123.0; // 1234123412341234200   - JavaScript
Run Code Online (Sandbox Code Playgroud)

我并不关心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

相同的变量打印不同的字符串,因为值不同.

xan*_*tos 3

这里有很多问题......

您正在使用long而不是double. 你需要写:

double x = 1234123412341234123.0;
Run Code Online (Sandbox Code Playgroud)

或者

var x = 1234123412341234123.0;
Run Code Online (Sandbox Code Playgroud)

另一个问题是 .NETdouble在将 s 转换为 之前将 s 舍入为 15 位string(因此在使用 打印之前Console.ToString())。

例如:

string str = x.ToString("f"); // 1234123412341230000.00
Run Code Online (Sandbox Code Playgroud)

例如参见/sf/answers/116089431/

内部号码仍然是17位,只是显示为15位。

如果你执行以下操作,你就可以看到它:

string str2 = x.ToString("r"); // 1.2341234123412342E+18
Run Code Online (Sandbox Code Playgroud)