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
相同的变量打印不同的字符串,因为值不同.
这里有很多问题......
您正在使用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)
内部号码仍然是17位,只是显示为15位。
如果你执行以下操作,你就可以看到它:
string str2 = x.ToString("r"); // 1.2341234123412342E+18
Run Code Online (Sandbox Code Playgroud)