BigDecimal:如何设置一次比例

时间:2014-06-13 12:54:36

标签: javascript

我正在使用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才能使用所需的小数位数格式化结果。

有没有办法配置一次比例,以便库始终使用并返回所需比例的小数?

2 个答案:

答案 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));
        };  
    })();