我正在使用Daniel Trebbien's BigDecimal library,我试图将比例设置为固定的小数位数。
我使用工厂方法在我的应用中以相同的比例创建所有小数:
function newBigDecimal(x){
return (new BigDecimal(x)).setScale(2, BigDecimal.prototype.ROUND_HALF_UP);
}
因此,当我在Bigdecimal上调用BigDecimal.toString,或者对它们进行否定,加法或减法时,结果字符串包含预期的小数位数。示例:
var pi = newBigDecimal("3.1416");
console.log(pi.toString());
//returns "3.14"
var e = newBigDecimal("2.7182");
console.log(e.toString());
//returns "2.72"
但是当我乘以时,结果十进制的小数是原始小数的两倍:
var product = pi.multiply(e);
console.log(product.toString());
//returns "8.5408"
我必须再次调用setScale才能使用所需的小数位数格式化结果。
有没有办法配置一次比例,以便库始终使用并返回所需比例的小数?
答案 0 :(得分:1)
我认为你正以错误的方式接近这一点。小数位数不应该取决于数据在您的应用中的存储方式,当您希望表示格式化 BigDecimal的问题>它作为一个字符串。我创建了一个如下所示的函数:
function formatBigDecimal(decimals) {
//return string with provided amount of decimals
}
每次要打印时都要使用它。
我认为设置比例只需要确保存储足够的小数,即出于计算目的,我不会在创建时截断为2位小数。始终尽可能延迟,以获得最大精度。
我无法立即找到该库的API参考,但我想你会想到它。
答案 1 :(得分:0)
在乘法中,生成新的十进制数。该库默认保留它们而不是丢失信息,这是正确的。
我需要的是实际格式化。所以我重新定义了BigDecimal.toString,如下所示:
(function(){
var oldToString = BigDecimal.prototype.toString;
BigDecimal.prototype.toString = function(){
return oldToString.apply(this.setScale(2, BigDecimal.prototype.ROUND_HALF_UP));
};
})();