我正在创建一个空闲的html5 5/js游戏,在这个游戏中,我使用bignumber.js库来存储任意长的数字,这是我对空闲游戏的要求。问题是,在配置中,我将EXPONENTIAL_AT选项设置为某个数字,并且在变量暴露大于EXPONENTIAL_AT之后,decimalPlaces函数不工作,即使使用"largeNumber.decimalPlaces(4)“,它也显示类似于"2.93012393841298e+23”的内容。
目前,脚本的部分内容如下:
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,因此指数表示法有效,但舍入不起作用。
我不知道我做错了什么,或者是否是一个bug,但我希望这应该像预期的那样起作用。
发布于 2020-09-28 15:35:19
请记住,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>
https://stackoverflow.com/questions/64105047
复制相似问题