为什么有很多有效数字的数字在c#和JavaScript中处理方式不同?
Why are numbers with many significant digits handled differently in C# and JavaScript?
如果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在将double
s转换为string
之前将其舍入到15位数字(因此在例如用Console.ToString()
打印它之前)。
string str = x.ToString("f"); // 1234123412341230000.00
参见https://stackoverflow.com/a/1658420/613130
内部号码仍然是17位,只是显示为15位。
你可以看到如果你执行a:
string str2 = x.ToString("r"); // 1.2341234123412342E+18
数字没有不同的处理方式,只是显示方式不同。
。NET显示15位有效数字,而JavaScript显示17位有效数字。根据所包含的数字,双精度数的表示可以包含15-17位有效数字。. net只显示该数字保证始终支持的位数,而JavaScript显示所有数字,但可能会出现精度限制。
。. NET在指数为15时开始使用科学计数法,而JavaScript在指数为21时开始使用科学计数法。这意味着JavaScript将显示18到20位的数字,最后用零填充。
在您的示例中将double
转换为long
将绕过。net显示double的方式。该数字将被转换为没有隐藏精度限制的四舍五入,因此在本例中,您将看到双精度型中的实际值。第17位之后不只有0的原因是该值是以二进制形式存储的,而不是十进制形式。
免责声明:这是基于标准维基百科页面
根据该标准的维基百科页面,它定义了十进制64应该有16位的精度。
在此之后,应该由实现者决定如何处理这些额外的数字。
所以你可能会说标准没有详细说明,但这些数字的设计无论如何都不符合标准规范。两种语言都有处理更大数字的方法,所以这些选项可能更适合您。
- javascript处理一个对象数组以获得一个新的对象数组
- 使用JavaScript处理JSON数据
- AJAX调用后使用JavaScript处理数据(CakePHP 2.6.x)
- 当send_data完成时,Rails send_data和Javascript处理程序
- 使用javascript处理XMLHttpRequest的正确方法
- Html<输入模式>使用JavaScript处理-超过时失败
- 在服务器上创建一个复选框,使用 javascript 处理函数
- Html+javascript处理网站中的语言
- 通过Javascript处理Windows Phone 7后退按钮
- 如何用JavaScript处理SQLite中snippet()的返回值
- Javascript处理v8引擎的内存泄漏问题
- 如何使用jquery/javascript处理来自多个动态创建的锚标记的onclick事件
- 我应该如何使用Javascript处理这个html表单
- 一个用 PHP 或 JavaScript 处理的大型数组
- 如何使用javascript处理大型html文本页面
- Javascript - 处理加载后生成内容的最佳方式
- 将悬停CSS添加到用javascript处理的表单元格中
- 使用 javascript 处理表单并在弹出窗口中使用它
- JavaScript 处理框架添加 NaN
- 使用参数调用 JavaScript 处理程序