如何在Javascript中乘法?小数问题
我用Javascript编写了以下代码:如何在Javascript中乘法?小数问题,javascript,decimal,multiplication,Javascript,Decimal,Multiplication,我用Javascript编写了以下代码: var m1 = 2232.00; var percent = (10/100); var total = percent*m1; alert(total); 问题是变量“total”给了我“223.200000000000002”,它应该是“223.2”,我应该怎么做才能得到正确的值呢?如果您试图显示这个数字,您可以将其转换为一个字符串。如果您这样做,请跟踪类型,因为您不能将字符串与另一个数字相乘 如果要在其他计算中使用它,可以将其截断为小数点后一位
var m1 = 2232.00;
var percent = (10/100);
var total = percent*m1;
alert(total);
问题是变量“total”给了我“223.200000000000002”,它应该是“223.2”,我应该怎么做才能得到正确的值呢?如果您试图显示这个数字,您可以将其转换为一个字符串。如果您这样做,请跟踪类型,因为您不能将字符串与另一个数字相乘 如果要在其他计算中使用它,可以将其截断为小数点后一位:
Math.round( total * 10 ) / 10
然而,正如许多人所指出的,不精确的值正是浮点数的方式
有关详细信息,请参阅评论中链接的问题。您无法获得准确的值。这是浮点数的基本问题 您可以使用
toFixed
强制固定数量的十进制数:
alert(total.toFixed(2));
但是,请记住,这将留下尾随的零,这可能是您不想要的。您可以使用.replace(/0+$/,'')删除它们代码>总计。toFixed(2)
可能会有所帮助。但是请注意,total
变量将被键入一个字符串。您可以这样做
var total = +(percent*m1).toPrecision(15);
223.2 === total; // true
223.2 === 0.1*2232.00; // false
我通过以下几页找到了答案,多亏了: 我决定使用以下类别,因为我需要操作的精确值,它们与货币操作相关:
var value = 3.666;
value.toFixed(2); //Output : 3.67
var value = 3.0000;
value.toFixed(2); //Output : 3.00
Exp 2:
var value = 3.666;
value.toFixed(2); //Output : 3.67
var value = 3.0000;
value.toFixed(2); //Output : 3.00
这是一个解决浮点数乘法问题的解决方案。这很简单,但对我来说很有效。用这个函数计算出数字的小数位数
function decimalPlaces(num) {
var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
if (!match) { return 0; }
return Math.max(
0,
// Number of digits right of decimal point.
(match[1] ? match[1].length : 0)
// Adjust for scientific notation.
- (match[2] ? +match[2] : 0));
}
最后的答案是“总计”
其中a,b是你的数字如果你使用的是角度,我为这个做了一个组件 带撑架安装
bower install angular-floating-point --save
用法
这是一个演示->这里是来源-> 用下面的代码片段自己尝试一下
angular.module('myApp',['floatingPoint']))
.controller('myCtrl',函数($scope,floatingPoint){
$scope.calculate=函数(){
$scope.result=$scope.num0*$scope.num1;
$scope.prettyResult=floatingPoint.makePretty($scope.result)
}
$scope.num0=6.1;
$scope.num1=6;
$scope.calculate();
});
我的Angular应用程序
(试试我)==>
X
丑陋的计算:
{{result}}
角度浮点计算:
{{prettyResult}}
这可以通过一个名为的外部库来完成,该库为JavaScript提供了十进制类型。它也可用于npm上的节点。下面是一个使用decimal.js从gustavomanolo复制原始示例的示例
//Decimal.js提供的十进制类型(http://mikemcl.github.io/decimal.js/)
var m1=新的十进制数(2232.00);
风险值百分比=新的小数点(10/100);
var总计=m1.mul(百分比);
日志('Total:',Total)代码>
试试看
var x = 0.07;
console.log((x+1)*100 - 100);
现在,将x的值替换为其他值
;-) 我找到了一个非常简单的解决方案。当涉及到十进制数时,*
运算符有点不正确,但/
运算符不正确。乘法可以很容易地转换为除法,因为A•b=A/(1/b)
只需将percent*m1
替换为times(percent,m1)
更新:它并不总是工作。运算符“*”和“/”并非总是工作正常,例如:
32.09 * 100 = 3209.0000000000005
100 / (1 / 32.09) = 3209.0000000000005
解决方案:
一个简单的方法是使用小数。toFixed(2),其中“2”是您想要的小数位数。但是您必须考虑这个返回字符串,它会对值进行四舍五入
45.6789.toFixed(2) —> "45.68" as String
另一个最完整的选项是使用.toLocaleString将数字正确地转换为所需的国家代码。您可以设置一对参数,将小数值始终固定为2。这还会返回一个字符串:
(654.3453).toLocaleString(
'en-US',
{minimumFractionDigits: 2, maximumFractionDigits: 2},
) —> "654.35" as String
如果您需要它作为一个数字,您可以将它包装成数字(…):
如果您只想要一个无小数的数字,请使用以下方法之一确保结果没有小数
Math.trunc(32.09); —> 32 as Number
(32.09).toFixed(0); —> “32” as String
32.09 | 0; —> 32 as Number
我最终得到了以下解决方案:
function decimalmultiply(a, b) {
return parseFloat((a * b).toFixed(12));
}
10.50*30.45=319.72499999999997
decimalmultiply(10.50,30.45)=319.725
此方法返回一个数字,而不是字符串,不截断有效小数(最多12位)。我希望这有助于。。。我花了一段时间才到达那里,但它确实起了作用
Number.prototype.CountDecimals = function () {
if (Math.floor(this.valueOf()) === this.valueOf())
return 0;
return this.toString().split(".")[1].length || 0;
};
String.prototype.PadRight = function (fullLength, character) {
if (String.isNullOrEmpty(this.toString()) || String.isNullOrEmpty(character))
return this.toString();
var value = this.toString();
while (value.length < fullLength)
value += character;
return value;
};
var Multiply = function () {
var maxNumberOfDecimals = 0;
for (var i = 0; i < arguments.length; i++) {
var decimals = arguments[i].CountDecimals();
if (decimals > maxNumberOfDecimals)
maxNumberOfDecimals=decimals;
}
var results = 1;
for (var j = 0; j < arguments.length; j++) {
var arg = arguments[j];
arg = arg * parseFloat('1'.PadRight(maxNumberOfDecimals + 1, '0'));
results = results * arg;
}
var divisor = parseFloat('1'.PadRight((maxNumberOfDecimals * arguments.length) +1, '0'));
return results / divisor;
};
Number.prototype.CountDecimals=函数(){
if(Math.floor(this.valueOf())==this.valueOf())
返回0;
返回此.toString().split(“.”[1]。长度| | 0;
};
String.prototype.PadRight=函数(全长,字符){
if(String.isNullOrEmpty(this.toString())| | String.isNullOrEmpty(character))
返回此.toString();
var value=this.toString();
while(value.lengthmaxNumberOfDecimals)
maxNumberOfDecimals=小数;
}
var结果=1;
对于(var j=0;j
事实上,我不需要将此值转换为字符串,因为我需要使用变量“total”与另一个变量相乘。您可以按原样安全地执行此操作。这就是JS、MSVC++float或double中浮点数的使用方式。这可能就是您要寻找的答案:
function decimalmultiply(a, b) {
return parseFloat((a * b).toFixed(12));
}
10.50*30.45=319.72499999999997
decimalmultiply(10.50,30.45)=319.725
Number.prototype.CountDecimals = function () {
if (Math.floor(this.valueOf()) === this.valueOf())
return 0;
return this.toString().split(".")[1].length || 0;
};
String.prototype.PadRight = function (fullLength, character) {
if (String.isNullOrEmpty(this.toString()) || String.isNullOrEmpty(character))
return this.toString();
var value = this.toString();
while (value.length < fullLength)
value += character;
return value;
};
var Multiply = function () {
var maxNumberOfDecimals = 0;
for (var i = 0; i < arguments.length; i++) {
var decimals = arguments[i].CountDecimals();
if (decimals > maxNumberOfDecimals)
maxNumberOfDecimals=decimals;
}
var results = 1;
for (var j = 0; j < arguments.length; j++) {
var arg = arguments[j];
arg = arg * parseFloat('1'.PadRight(maxNumberOfDecimals + 1, '0'));
results = results * arg;
}
var divisor = parseFloat('1'.PadRight((maxNumberOfDecimals * arguments.length) +1, '0'));
return results / divisor;
};