如何在Javascript中繁殖? 与小数的问题(How to multiply in Java

2019-07-18 15:09发布

我在Javascript以下代码:

var m1 = 2232.00;
var percent = (10/100);
var total = percent*m1;
alert(total);

问题是,变量“总”给我“223.20000000000002”,它应该是“223.2”,我应该怎么做才能得到正确的值?

Answer 1:

.toFixed()是最好的solution.It将只保留两位小数点后面。

实验1:

var value = 3.666;
value.toFixed(2); //Output : 3.67

实验2:

var value = 3.0000;
value.toFixed(2); //Output : 3.00


Answer 2:

你不能得到确切的价值。 这与浮点数的根本问题。

你可以强制与十进制数的固定数量的toFixed

alert(total.toFixed(2));

但是,请记住,这将离开尾随零,你可能不希望。 你可以删除它们.replace(/0+$/,'');



Answer 3:

如果你试图显示这个数字,你都可以转换成一个字符串toFixed(1) 。 如果你这样做,跟踪类型的,因为你不能再乘以另一个数字的字符串。

如果你打算在其他计算来使用它,你可以把它截断到小数点后一位:

Math.round( total * 10 ) / 10

然而,正如不同的人所指出的,不精确的值是现在的样子浮点数是。

参见更多良好的信息的评论链接的问题。



Answer 4:

我找到了答案通过以下页面,感谢迪米特里 :

浮点速查表为JavaScript

我决定,因为我需要操作的精确值,他们是与金钱有关的操作使用以下clases:

  • https://github.com/MikeMcl/big.js
  • https://github.com/MikeMcl/bignumber.js/


Answer 5:

这样能很好地与外部库调用来完成decimal.js提供一个Decimal类型的JavaScript。 它也可用于节点上NPM。 下面是复制使用gustavomanolo decimal.js最初的例子为例。

 // Decimal type provided by decimal.js (http://mikemcl.github.io/decimal.js/) var m1 = new Decimal( 2232.00 ); var percent = new Decimal( 10/100 ); var total = m1.mul(percent); console.log( 'Total:', total ); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/7.2.3/decimal.min.js"></script> 



Answer 6:

这里是一个变通的解决方案浮点数的乘法。 这是很简单,但对我的作品。 你找出数多少小数有这个功能。

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

然后换你的最后答案“总”你做

total = total.toFixed(decimalPlaces(a)+decimalPlaces(b));

其中a,b是你的号码



Answer 7:

total.toFixed(2)可能会有帮助。 但需要注意的是, total变量是将类型强制转换为字符串。



Answer 8:

试一试

var x = 0.07;
console.log((x+1)*100 - 100);

现在,对于其它值代替x的值;-)



Answer 9:

运算符“*”和“/”不工作总是完美,例如:

32.09 * 100 = 3209.0000000000005
100 / (1 / 32.09) = 3209.0000000000005

解:

一个解决方案,轻松之一,有小数的期运用.toFixed(2)其中“2”是您想要的小数位数。 但是你必须考虑到这一点回报,你一个字符串,并取的价值。

45.6789.toFixed(2) —> "45.68" as String

其他选项,功能最齐全,使用.toLocaleString是正确转换数所需的国家代码。 您可以设置一对则params的总是固定小数值2。这也将返回一个字符串:

(654.3453).toLocaleString(
  'en-US',
  {minimumFractionDigits: 2, maximumFractionDigits: 2},
) —> "654.35" as String

如果你需要一个号码,就可以把它包装成数(...):

Number((654.3453).toLocaleString(
  'en-US',
  {minimumFractionDigits: 2, maximumFractionDigits: 2},
)) —> 654.35 as Number

如果你只想要一个没有十进制数,使用此方法之一,以确保结果是无小数。

Math.trunc(32.09); —> 32 as Number  
(32.09).toFixed(0); —> “32” as String
32.09 | 0; —> 32 as Number


Answer 10:

你可以这样做

var total = +(percent*m1).toPrecision(15);

223.2 === total;          // true
223.2 === 0.1*2232.00;    // false


Answer 11:

如果您使用的角度,我做了一个组件,用于此。

与亭子安装

bower install angular-floating-point --save

用法

var pretty = floatingPoint.makePretty(6.1*6);

这里是一个演示- > https://mattspaulding.github.io/angular-floating-point
下面是源- > https://github.com/mattspaulding/angular-floating-point

自己与下面这个片断尝试。

  angular.module('myApp', ['floatingPoint']) .controller('myCtrl', function ($scope, floatingPoint) { $scope.calculate = function () { $scope.result =$scope.num0*$scope.num1; $scope.prettyResult=floatingPoint.makePretty($scope.result) } $scope.num0=6.1; $scope.num1=6; $scope.calculate(); }); 
 <html> <head> <title>My Angular App</title> <script src='//code.jquery.com/jquery-latest.min.js'></script> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <script src="https://rawgit.com/mattspaulding/angular-floating-point/master/dist/angular-floating-point.min.js"></script> </head> <body ng-app="myApp" ng-controller="myCtrl"> <div class="row" style="padding-top: 10px;text-align:center"> <label>(try me) ==> </label> <input ng-model="num0" ng-change="calculate()" style="width:100px; height:30px"> X <input ng-model="num1" ng-change="calculate()" style="width:100px; height:30px"> </div> <div class="row" style="padding-top: 50px;"> <div class="col-xs-6"> <label style="float: right;">Ugly calculation:</label> </div> <div class="col-xs-6"> <label style="float: left;">{{result}}</label> </div> </div> <div class="row" style="padding-top: 20px;"> <div class="col-xs-6"> <label style="float: right;"><span style="color:blue">Angular Floating Point</span> calculation:</label> </div> <div class="col-xs-6"> <label style="float: left;">{{prettyResult}}</label> </div> </div> </body> 



Answer 12:

我发现了一个很简单的解决方案。 在*运算符是一个有点坏了,当涉及到十进制数,但/运营商不可。 乘法可以由于•B很容易地转化为司= A /(1 / B)

function times(a, b) { return a/(1/b) }

只需更换percent * m1times(percent, m1)

更新:它不工作,所有的时间。



Answer 13:

我结束了以下解决方案:

function decimalmultiply(a, b) {
    return parseFloat((a * b).toFixed(12));
}

10.50*30.45=319.72499999999997
decimalmultiply(10.50,30.45)=319.725

该方法返回一个 ,而不是字符串 ,不截断显著小数(最多12个)。



文章来源: How to multiply in Javascript? problems with decimals