提问人:griswold88 提问时间:8/28/2019 更新时间:8/28/2019 访问量:104
如何将 11 到 30 之间的整数乘以 0.015?[复制]
How do I multiply the integers between 11 and 30 by 0.015? [duplicate]
问:
我正在尝试打印出从 11 到 30 乘以 0.015 的整数
for ( let i = 11; i <= 30; i++ ) {
console.log( `${i} * 0.015 = ${i * 0.015}` );
}
我希望输出如下所示:
11 * 0.015 = 0.165
12 * 0.015 = 0.18
13 * 0.015 = 0.195
14 * 0.015 = 0.21
15 * 0.015 = 0.225
16 * 0.015 = 0.24
17 * 0.015 = 0.255
18 * 0.015 = 0.27
19 * 0.015 = 0.285
20 * 0.015 = 0.3
21 * 0.015 = 0.315
22 * 0.015 = 0.33
23 * 0.015 = 0.345
24 * 0.015 = 0.36
25 * 0.015 = 0.375
26 * 0.015 = 0.39
27 * 0.015 = 0.405
28 * 0.015 = 0.42
29 * 0.015 = 0.435
30 * 0.015 = 0.45
相反,我得到这个:
11 * 0.015 = 0.16499999999999998
12 * 0.015 = 0.18
13 * 0.015 = 0.195
14 * 0.015 = 0.21
15 * 0.015 = 0.22499999999999998
16 * 0.015 = 0.24
17 * 0.015 = 0.255
18 * 0.015 = 0.27
19 * 0.015 = 0.285
20 * 0.015 = 0.3
21 * 0.015 = 0.315
22 * 0.015 = 0.32999999999999996
23 * 0.015 = 0.345
24 * 0.015 = 0.36
25 * 0.015 = 0.375
26 * 0.015 = 0.39
27 * 0.015 = 0.40499999999999997
28 * 0.015 = 0.42
29 * 0.015 = 0.435
30 * 0.015 = 0.44999999999999996
我在 StackOverflow 上环顾四周,似乎 JavaScript 在浮点精度方面存在问题。因此,我尝试了一种将数字四舍五入到任意步骤的方法之一:
function round( number, step ) {
const inverseStep = 1 / step;
return Math.round( number * inverseStep ) / inverseStep;
}
for ( let i = 11; i <= 30; i++ ) {
const rounded = round( i * 0.015, 0.015 );
console.log( `${i} * 0.015 = ${rounded}` );
}
我仍然用奇怪的无理小数得到相同的结果。
答:
1赞
Mike
8/28/2019
#1
浮点精度足以完成工作,您只需要对其进行舍入即可。你可以使用
.toFixed(2)
将结果四舍五入到小数点后两位。
请注意,这会将您的结果转换为字符串(这对您正在执行的操作来说很好),因此如果您转换回浮点数,则将返回不准确。如果你真的担心确切的值,你应该使用像 Decimal.js 这样的东西,它将数字作为字符串而不是浮点数处理。特别是如果你正在做任何事情,比如计算钱。
评论
0赞
Pointy
8/28/2019
该函数返回一个字符串,而不是一个数字。.toFixed()
0赞
Mike
8/28/2019
没错,但它仍然正确四舍五入,所以如果你需要它作为一个数字,那么只需投射它。此外,他只是打印出结果,所以他需要它作为一个字符串
0赞
Pointy
8/28/2019
是的,但是一旦你投出它,你就会回到二进制浮点轨道,而且由于所有相同的原因,它不一定是确切的值。
0赞
Mike
8/28/2019
这很公平,但是在这一点上,您真的不应该使用浮点数,而应该使用Decimal.js之类的东西
1赞
azbarcea
8/28/2019
根据要求,该人需要打印它,因此在这种情况下,转换为字符串应该不是问题,但确实会作为对您的答案的更新有所帮助,例如: 观察:(...
0赞
himank
8/28/2019
#2
它与 javascript 无关。任何使用 IEEE 标准 754 来表示实数的语言都有这个。基本上,大多数实数都无法准确表示。因此,会发生什么,采用近似值(通常为 53 位)。
在这里你可以使用 Number.toPrecision()。
评论
2赞
Mario Vernari
8/28/2019
53 位,而不是数字!
0赞
himank
8/28/2019
是的,我的错误。
0赞
azbarcea
8/28/2019
#3
根据您的工作:
function round( number, step ) {
const inverseStep = 1 / step;
return Math.round( number * inverseStep ) / inverseStep;
}
for ( let i = 11; i <= 30; i++ ) {
const rounded = round( i * 0.015, 0.001 );
console.log( `${i} * 0.015 = ${rounded}` );
}
您的输出将是:
'11 * 0.015 = 0.165'
'12 * 0.015 = 0.18'
'13 * 0.015 = 0.195'
'14 * 0.015 = 0.21'
'15 * 0.015 = 0.225'
'16 * 0.015 = 0.24'
'17 * 0.015 = 0.255'
'18 * 0.015 = 0.27'
'19 * 0.015 = 0.285'
'20 * 0.015 = 0.3'
'21 * 0.015 = 0.315'
'22 * 0.015 = 0.33'
'23 * 0.015 = 0.345'
'24 * 0.015 = 0.36'
'25 * 0.015 = 0.375'
'26 * 0.015 = 0.39'
'27 * 0.015 = 0.405'
'28 * 0.015 = 0.42'
'29 * 0.015 = 0.435'
'30 * 0.015 = 0.45'
评论
1赞
RobG
8/28/2019
从副本:执行没有 step 参数的作业。这两种方法都有局限性。parseFloat((i * 0.015).toFixed(10))
0赞
azbarcea
8/29/2019
正确。我试图以最小的更改限制他的示例和代码。@RobG 我为您的评论投了赞成票:-)
0赞
Seder
8/28/2019
#4
这些家伙做了出色的工作,为什么会发生这种情况
如果您仍然需要将其转换为数字,则可以将其与 中显式地将提供的值转换为数字进行处理parseFloat
Number
for ( let i = 11; i <= 30; i++ ) {
console.log( `${i} * 0.015 = ${parseFloat(Number(i * 0.015).toFixed(3))}` );
}
这里有一个很好的解释,解释了为什么会发生这种情况,以及解决它的不同方法。
0赞
WaltDe
8/28/2019
#5
使用校正因子技巧。
$ cat num
let cf = 10
for ( let i = 11; i <= 30; i++ ) {
let num = (i * cf) * (.015 * cf) / (cf *cf);
console.log( `${i} * 0.015 = ${num}` );
}
$ node ./num
11 * 0.015 = 0.165
12 * 0.015 = 0.18
13 * 0.015 = 0.195
14 * 0.015 = 0.21
15 * 0.015 = 0.225
16 * 0.015 = 0.24
17 * 0.015 = 0.255
18 * 0.015 = 0.27
19 * 0.015 = 0.285
20 * 0.015 = 0.3
21 * 0.015 = 0.315
22 * 0.015 = 0.33
23 * 0.015 = 0.345
24 * 0.015 = 0.36
25 * 0.015 = 0.375
26 * 0.015 = 0.39
27 * 0.015 = 0.405
28 * 0.015 = 0.42
29 * 0.015 = 0.435
30 * 0.015 = 0.45
如果您不介意零填充,请使用 toFixed 选项将让您关闭。
$ cat num
for ( let i = 11; i <= 30; i++ ) {
let num = i * .015;
num = num.toFixed(3);
console.log( `${i} * 0.015 = ${num}` );
}
$ node ./num
11 * 0.015 = 0.165
12 * 0.015 = 0.180
13 * 0.015 = 0.195
14 * 0.015 = 0.210
15 * 0.015 = 0.225
16 * 0.015 = 0.240
17 * 0.015 = 0.255
18 * 0.015 = 0.270
19 * 0.015 = 0.285
20 * 0.015 = 0.300
21 * 0.015 = 0.315
22 * 0.015 = 0.330
23 * 0.015 = 0.345
24 * 0.015 = 0.360
25 * 0.015 = 0.375
26 * 0.015 = 0.390
27 * 0.015 = 0.405
28 * 0.015 = 0.420
29 * 0.015 = 0.435
30 * 0.015 = 0.450
评论