Javascript BigDecimal:如何设置一次刻度

Javascript BigDecimal:如何设置一次刻度,javascript,Javascript,我正在使用,我正在尝试将刻度设置为固定的小数位数 我使用工厂方法在我的应用程序中创建具有相同比例的所有小数: function newBigDecimal(x){ return (new BigDecimal(x)).setScale(2, BigDecimal.prototype.ROUND_HALF_UP); } 因此,当我在BigDecimal上调用BigDecimal.toString,或者对它们进行求反、加法或减法时,结果字符串包含预期的小数数。例如: var pi = ne

我正在使用,我正在尝试将刻度设置为固定的小数位数

我使用工厂方法在我的应用程序中创建具有相同比例的所有小数:

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,以将结果格式化为所需的小数位数


是否有一种方法可以配置一次刻度,以便库始终使用所需的刻度并返回小数?

我认为您的方法是错误的。小数的数量不应该是数据如何存储在应用程序中的问题,而应该是格式化的问题当您希望将其表示为字符串时的大小数。我将创建一个如下所示的函数:

function formatBigDecimal(decimals) {
   //return string with provided amount of decimals
}
每次你想打印的时候都用这个

我认为设置刻度只需要确保存储了足够的小数,也就是说,为了计算的目的,我不会在创建时截断为2个小数。始终尽可能晚地取整,以获得最大精度


我无法立即找到该库的API引用,但我想您会找到的。

在乘法运算中,会生成新的十进制数。库在默认情况下保留它们,而不是丢失信息,这是正确的

我需要的实际上是格式化。因此,我重新定义了BigDecimal.toString,如下所示:

    (function(){
        var oldToString = BigDecimal.prototype.toString;

        BigDecimal.prototype.toString = function(){
            return oldToString.apply(this.setScale(2, BigDecimal.prototype.ROUND_HALF_UP));
        };  
    })();

我还认为,计算应尽可能多地利用现有信息。问题是我需要显示中间结果,最终结果可能与用户基于已舍入的中间结果所期望的结果不同。另外,在大多数情况下(货币),小数点超过2位是没有意义的。@MisterSmith如果小数点超过2位是没有意义的,为什么要使用BigDecimal呢?顺便说一下,货币和货币不应该使用浮动。它们可以用整数来表示,在向用户显示时,你只需除以100(美元、欧元、英镑等)。这将是最好的选择,我个人也像你在以前的项目中所说的那样做过,但出于几个原因,这不是一个选项。如果不修改原型并像我在回答中所说的那样编写一个特定的格式化函数,您就不能这样做吗?我不是一个javascript专家,但我总是听说弄乱原型是个坏主意。@MDeSchaepmeester是的,我本可以这样做,但是我必须在代码中搜索对
biginger.toString
的每次调用,然后从那里调用格式化函数。时间就是金钱。