重复数字:如何在将一个数字除以另一个数字时得到非圆整的重复数字?

4

我正在尝试解决一个涉及重复数字的JavaScript练习,在这个过程中,我需要处理到相当多的小数位数。

目前我正在使用:

function divide(numerator, denominator){
    var num = (numerator/parseFloat(denominator);
}
// 7/11 = 0.6363636363636364
// 5/3 = 1.6666666666666667
// 3/8 = 0.375

可以看到,包含重复数字的运算结果会将最后一位数字四舍五入。诱人的做法是将其转换为数组并使用pop()删除每个数字的最后一位,但是当我们遇到不重复的数字时(例如3/8 = 0.375),这会导致问题。

如何计算两个数字的商,得到类似于5/3 = 1.666666666666666这样的结果?(基本上将最后一位数字向下舍入,而不是向上舍入)

感谢您的帮助。


1
你看过任何大数选项吗?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt中有一个新选项,还有一些“外部”库。 - MikeB
我已经考虑过使用BigInt作为一个选项,但是没有找到一种解决方案能够让我处理小数。可能有一种方法可以使用BigInt,但如果有的话,我目前不知道该方法。 - Didgeridude
抱歉,我忘记了那只支持整数,但如果你搜索“js bigint的替代方案”,你应该会找到很多库,我找到的第一个是 https://bellard.org/quickjs/jsbignum.html,它肯定有bigFloat功能。 - MikeB
请看这个链接 https://floating-point-gui.de/languages/javascript/ - aksappy
相关:检测重复小数的算法? - Heretic Monkey
1个回答

0

对于简单的情况,我通常使用round-to npm包:

import roundTo from 'round-to';

const num = 5/3; // 1.6666666666666667
// set your desired number of decimal places:
const numDecimalPlaces = (num + "").split(".")[1].length; 
// Based on your question, I think this is what you are trying to achieve:
const roundedDown = roundTo.down(num, numDecimalPlaces - 1); // 1.6666666666666667
// You can also do these:
const rounded = roundTo(num, numDecimalPlaces); // 1.6666666666666667
const roundedUp = roundTo.up(num, numDecimalPlaces); // 1.6666666666666667

如果您不想安装他们的软件包,您可以从Github复制他们的实现。他们的源代码非常易于理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接