问题描述
我正在创建一个闲置的html5 / js游戏,在其中我使用bignumber.js库来存储任意长的数字,这是我对闲置游戏的要求。问题是,在配置中,我将EXPONENTIAL_AT选项设置为某个数字,并且变量expoent大于EXPONENTIAL_AT之后,decimalPlaces函数不起作用,即使使用“ largeNumber”,它也会显示类似“ 2.93012393841298e + 23”的内容.decimalPlaces(4)”。
当前,脚本的部分内容如下:
BigNumber.config({
DECIMAL_PLACES: 4,EXPONENTIAL_AT: 16,ROUNDING_MODE: BigNumber.ROUND_HALF_UP
});
var largeNumber = new BigNumber("10594.1931247123691823e+23");
console.log(largeNumber.dp(4).toString());
这将在控制台中显示:1.05941931247123691823e+27
,因此指数表示法有效,但舍入无效。
我不知道我在做什么错或者是一个错误,但是我希望这应该可以正常工作。
解决方法
请记住,10594.1931247123691823e+23
(和1.05941931247123691823e+27
)代表此数字:
1059419312471236918230000000
如您所见,它根本没有小数部分 ,小数点右边的有效数字为零。因此.dp(4)
不会影响它。
如果您的数字有小数部分,则.dp(4)
可以使用。我在下面做了一个例子。出于示例的目的,我已告诉BigNumber在30位数字之前不要切换到指数表示法,所以这很明显是怎么回事。但这只是为了显示正在发生的事情,这不是解决方案,您不必这样做。没问题要解决:您的数字已经四舍五入(实际上);这是一个整数。
这里是例子:
BigNumber.config({
EXPONENTIAL_AT: 30,});
// Just for reference:
const yourNumber = new BigNumber("10594.1931247123691823e+23");
console.log(yourNumber.toString()); // 1059419312471236918230000000
// Your number plus six places of fraction:
const num = BigNumber("1059419312471236918230000000.123456");
console.log(num.toString()); // 1059419312471236918230000000.123456
// Rounded:
const rounded = num.dp(4);
console.log(rounded.toString()); // 1059419312471236918230000000.1235
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/9.0.0/bignumber.min.js"></script>