什么';这是JavaScript可以使用的第一个数字';你不能准确地表示吗?

什么';这是JavaScript可以使用的第一个数字';你不能准确地表示吗?,javascript,Javascript,我在研究货币价值,所以准确计算很重要 我当前的代码将字符串分解为标记,然后对其求值。对于十进制值,它首先将其转换为整数,然后进行计算,再转换回十进制 例如,如果我有一个表达式 "0.1 * 0.2" 第一步是将其分解为标记0.1、*和0.2。然后,它执行一些其他的malarky操作,并计算出它需要将0.1和0.2组合在一起。计算结果将是 1 * 2 / 100 计算以整数形式进行,以防止JavaScript舍入错误,即 0.1 * 0.2 == 0.020000000000000004 我

我在研究货币价值,所以准确计算很重要

我当前的代码将字符串分解为标记,然后对其求值。对于十进制值,它首先将其转换为整数,然后进行计算,再转换回十进制

例如,如果我有一个表达式

"0.1 * 0.2"
第一步是将其分解为标记
0.1
*
0.2
。然后,它执行一些其他的malarky操作,并计算出它需要将
0.1
0.2
组合在一起。计算结果将是

1 * 2 / 100
计算以整数形式进行,以防止JavaScript舍入错误,即

0.1 * 0.2 == 0.020000000000000004

我的论点是,最初将字符串转换为浮点,已经失去了精度。所以我的问题是如果数字不能用JavaScript精确表示,那么0的上界和下界是多少?这样我就可以检查并处理它,如果这是正确的方法。

我不认为有任何这样的数字可以说它是JavaScript无法准确表示的第一个数字。这一切都是关于十进制数和精度的损失

另外,JavaScript中没有十进制数据类型-唯一的数字数据类型是浮点型。JavaScript使用64位浮点表示


浮点舍入错误。由于缺少5的基本因子,0.1在基数-2中不能像在基数-10中那样准确地表示。还要注意的是,每个浮点数学都是这样的,并且是基于

的,我不认为有任何这样的数字,你可以说它是JavaScript无法准确表示的第一个数字。这一切都是关于十进制数和精度的损失

另外,JavaScript中没有十进制数据类型-唯一的数字数据类型是浮点型。JavaScript使用64位浮点表示


浮点舍入错误。由于缺少5的基本因子,0.1在基数-2中不能像在基数-10中那样准确地表示。还要注意的是,每个浮点数学都是这样的,并且基于

如果我没有弄错的话,所有JS引擎都使用IEEE 754 double来处理浮点数

请查看页面的“双精度示例”部分。如果数字接近0,请仔细查看次正常值公式:

因此,JavaScript浮点数据类型中最接近零的数字是21-1023*2-52=2-1022*2-52=2-1074

根据经验:

Math.pow(2,-1074) = 5e-324
Math.pow(2,-1075) = 0

如果我没有弄错的话,所有JS引擎都使用IEEE 754 double来处理浮点数

请查看页面的“双精度示例”部分。如果数字接近0,请仔细查看次正常值公式:

因此,JavaScript浮点数据类型中最接近零的数字是21-1023*2-52=2-1022*2-52=2-1074

根据经验:

Math.pow(2,-1074) = 5e-324
Math.pow(2,-1075) = 0

你所描述的问题不是边界问题。IEEE-754双精度二进制浮点数可以完美地表示值
0.5
,但不能完美地表示,比如说
0.1
。请注意,这些数字的位数相同。问题不在于精度的位数,而是数字类型使用的基数与我们不同。它使用基数2,而不是我们的基数10

正如我们无法在10进制系统中准确表示
1/3
,某些数字也无法在IEEE-754的2进制系统中准确表示

2008年,IEEE发布了一个修订版,在IEEE-754中添加了一种新的格式(它定义了几种格式;JS使用的“双精度二进制”格式只是其中之一),称为“”,它使用基数10而不是基数2,适用于需要以与我们相同的方式处理舍入的应用程序(金融应用程序等)。这可能开始渗透到编程语言等领域;目前,IEEE-754单精度和双精度是使用的典型标准,其他标准不基于最新的IEEE-754标准,如C#s
decimal


同时,还有用于JavaScript的“大十进制”库,例如(没有使用它,没有附属关系)。如果您搜索“JavaScript中的bignumber”或“JavaScript精确浮点”,您应该会找到多个选项。

您描述的问题不是边界问题。IEEE-754双精度二进制浮点数可以完美地表示值
0.5
,但不能完美地表示,比如说
0.1
。请注意,这些数字的位数相同。问题不在于精度的位数,而是数字类型使用的基数与我们不同。它使用基数2,而不是我们的基数10

正如我们无法在10进制系统中准确表示
1/3
,某些数字也无法在IEEE-754的2进制系统中准确表示

2008年,IEEE发布了一个修订版,在IEEE-754中添加了一种新的格式(它定义了几种格式;JS使用的“双精度二进制”格式只是其中之一),称为“”,它使用基数10而不是基数2,适用于需要以与我们相同的方式处理舍入的应用程序(金融应用程序等)。这可能开始渗透到编程语言等领域;目前,IEEE-754单精度和双精度是使用的典型标准,其他标准不基于最新的IEEE-754标准,如C#s
decimal


同时,还有用于JavaScript的“大十进制”库,例如(没有使用它,没有附属关系)。如果您搜索“JavaScript中的bignumber”或“JavaScript精确浮点”,您应该会找到多个选项。

我注意到您正在进行货币计算。您可能会发现在这里使用整数更好。使用整数表示以美分为单位的价格。这就消除了与