Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中乘法?小数问题_Javascript_Decimal_Multiplication - Fatal编程技术网

如何在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”,我应该怎么做才能得到正确的值呢?如果您试图显示这个数字,您可以将其转换为一个字符串。如果您这样做,请跟踪类型,因为您不能将字符串与另一个数字相乘 如果要在其他计算中使用它,可以将其截断为小数点后一位

我用Javascript编写了以下代码:

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

我通过以下几页找到了答案,多亏了:

我决定使用以下类别,因为我需要操作的精确值,它们与货币操作相关:

.toFixed()是最好的解决方案。它将只保留点后的两个数字

Exp 1:

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;
};