如何在没有数学库的情况下截断JavaScript中的小数?
我需要数字只有2位小数(如货币),我使用的是:如何在没有数学库的情况下截断JavaScript中的小数?,javascript,angularjs,Javascript,Angularjs,我需要数字只有2位小数(如货币),我使用的是: Number(parseFloat(Math.trunc(amount_to_truncate * 100) / 100)); 但是我不能再支持数学图书馆了 没有数学库,没有小数舍入,我怎么能做到这一点呢?你可以使用非舍入的数字 console.log(parseInt(15.555*100,10)/100);//15.55不四舍五入 console.log((15.555*100 | 0)/100);//15.55无舍入,仅32位 conso
Number(parseFloat(Math.trunc(amount_to_truncate * 100) / 100));
但是我不能再支持数学图书馆了
没有数学库,没有小数舍入,我怎么能做到这一点呢?你可以使用非舍入的数字
console.log(parseInt(15.555*100,10)/100);//15.55不四舍五入
console.log((15.555*100 | 0)/100);//15.55无舍入,仅32位
console.log((15.555.toFixed(2));//15.56四舍五入
您可以使用
如果您确定您的输入总是低于或等于21474836.47
((2^31-1)/100
)(32位),则:
如果需要作为字符串(以确保结果有2个小数)
否则
((amount_to_truncate * 100|0)/100)
其他:请参见的答案
console.log(((15.555*100)| 0)/100))//将不舍入:15.55
console.log(((15*100)| 0)/100.toFixed(2))//将不舍入:15.55
我认为toFixed
唯一的错误是它舍入了OP明确表示他们不想做的精度。对于正数而言,Truncate更等同于floor
;对于负数而言,Truncate更等同于ceil
,而不是round
或toFixed
。在的MDN页面上,有一个polyfill替换函数,可以实现OP所期望的功能
Math.trunc = Math.trunc || function(x) {
return x - x % 1;
}
如果您只是使用它,那么代码就不必更改。您可以将parseInt截断,然后除以100并使用parseFloat
var num = 123.4567;
num=parseInt(num*100);
num=parseFloat(num/100);
alert(num);
看
编辑:为了应对javascript数学狂热,您可以使用.toFixed和一个额外的乘法/除法数字:
var num = 123.4567;
num = (num*1000).toFixed();
num = parseInt(num/10);
num = parseFloat(num/100);
alert(num);
更新了让它变得简单
const trunc = (n, decimalPlaces) => {
const decimals = decimalPlaces ? decimalPlaces : 2;
const asString = n.toString();
const pos = asString.indexOf('.') != -1 ? asString.indexOf('.') + decimals + 1 : asString.length;
return parseFloat(n.toString().substring(0, pos));
};
console.log(trunc(3.14159265359));
console.log(trunc(11.1111111));
console.log(trunc(3));
console.log(trunc(11));
console.log(trunc(3.1));
console.log(trunc(11.1));
console.log(trunc(3.14));
console.log(trunc(11.11));
console.log(trunc(3.141));
console.log(trunc(11.111));
Truncate也有舍入功能,所以你的陈述:“我需要数字只有2个小数……不舍入小数”在我看来有点复杂,会导致一场长时间的讨论
除此之外,在处理金钱问题时,问题不在于数学,而在于你如何使用它。我建议您阅读-否则,即使是像1.40-1.00这样的简单计算,您也会失败
您的问题的解决方案是使用经过良好测试的库来计算任意精度的小数,如或(仅作为示例)
编辑:
如果您确实需要一个片段,我不久前就是这样做的:
function round2(d) { return Number(((d+'e'+2)|0)+'e-'+2); }
这比我想象的要容易得多:
const trunc = (number, precision) => {
let index = number.toString().indexOf(".");
let subStr;
// in case of no decimal
if (index === -1) {
subStr = number.toString();
}
// in case of 0 precision
else if (precision === 0) {
subStr = number.toString().substring(0, index);
}
// all else
else {
subStr = number.toString().substring(0, index + 1 + precision);
}
return parseFloat(subStr);
};
let x = trunc(99.12, 1);
console.log("x", x);
你可以试试这个
函数trunc(值){
返回(!!value&&typeof value==“number”)?值-值%1:0;
}
控制台日志(trunc(1.4));
控制台日志(trunc(111.9));
控制台日志(trunc(0.4));
控制台日志(trunc(“1.4”)代码>为什么不能使用数学
?它无处不在。Number(amount\u to\u truncate.toFixed(2))
OP希望截断结果toFixed
将取而代之。@MichaelLiu答案已更新。我仍然坚持使用toFixed
((2.28*100 | 0)/100)。toFixed(2)
输出“2.27”,因为console.log(2.28*100)代码>输出227.99999997<代码>数字(2.286.toFixed(2))
输出2.29,因为toFixed rounds@tolgahanalbayrak这对10000000000000000000这样的大数字产生了令人惊讶的结果。避免使用parseInt
可能会更安全。正如OP所提到的那样,它的价值不太可能是金钱。console.log((15*100 | 0)/100)
将输出15而不是15.00
@TolgahanAlbayrak,您提到的结果只有字符串才能实现。欢迎来到的奇妙世界。与其他答案相同的问题,它在2.28这样的特定情况下失败,因为2.28*100=227.9999999997,所以num=2.28,最终结果是2.27为什么2.28*100等于227.999999999 7?我不知道,原因是什么。在控制台中尝试一下,你会发现。我只是刚刚发现javascript数学中的这个奇怪之处。这里有一个解决方法:您可能是对的,但我不能(或不应该)向这个特定项目添加额外的库。看起来是目前为止唯一有效的方法。@DavidPrieto:THX感谢您的反馈,因为我对这个主题也很感兴趣,请您解释一下我的round2()函数在哪里与您接受的trunc()函数不匹配?这仅仅是因为你不需要数学库,或者你发现了一些其他问题?我刚刚看到你的编辑。看起来这两个函数的工作方式基本相同,我刚刚测试了它们在第二轮中都失败了(2.99999999999999999)=3我刚刚发现它在trunc上失败了(2.99999999999999999)=3。我真的很讨厌JavaScript。
const trunc = (n, decimalPlaces) => {
const decimals = decimalPlaces ? decimalPlaces : 2;
const asString = n.toString();
const pos = asString.indexOf('.') != -1 ? asString.indexOf('.') + decimals + 1 : asString.length;
return parseFloat(n.toString().substring(0, pos));
};
console.log(trunc(3.14159265359));
console.log(trunc(11.1111111));
console.log(trunc(3));
console.log(trunc(11));
console.log(trunc(3.1));
console.log(trunc(11.1));
console.log(trunc(3.14));
console.log(trunc(11.11));
console.log(trunc(3.141));
console.log(trunc(11.111));
function round2(d) { return Number(((d+'e'+2)|0)+'e-'+2); }
const trunc = (number, precision) => {
let index = number.toString().indexOf(".");
let subStr;
// in case of no decimal
if (index === -1) {
subStr = number.toString();
}
// in case of 0 precision
else if (precision === 0) {
subStr = number.toString().substring(0, index);
}
// all else
else {
subStr = number.toString().substring(0, index + 1 + precision);
}
return parseFloat(subStr);
};
let x = trunc(99.12, 1);
console.log("x", x);