gpt4 book ai didi

javascript - 为什么具有许多有效数字的数字在 C# 和 JavaScript 中的处理方式不同?

转载 作者:数据小太阳 更新时间:2023-10-29 04:14:45 26 4
gpt4 key购买 nike

如果 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

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

最佳答案

这里有多个问题...

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

double x = 1234123412341234123.0;

var x = 1234123412341234123.0;

另一个问题是 .NET 在将其转换为 string 之前将 double 舍入为 15 位数字(因此,例如在使用 Console.ToString( )).

例如:

string str = x.ToString("f"); // 1234123412341230000.00

参见示例 https://stackoverflow.com/a/1658420/613130

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

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

string str2 = x.ToString("r"); // 1.2341234123412342E+18

关于javascript - 为什么具有许多有效数字的数字在 C# 和 JavaScript 中的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30475233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com