我在Javascript以下代码:
var m1 = 2232.00;
var percent = (10/100);
var total = percent*m1;
alert(total);
问题是,变量“总”给我“223.20000000000002”,它应该是“223.2”,我应该怎么做才能得到正确的值?
我在Javascript以下代码:
var m1 = 2232.00;
var percent = (10/100);
var total = percent*m1;
alert(total);
问题是,变量“总”给我“223.20000000000002”,它应该是“223.2”,我应该怎么做才能得到正确的值?
.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
你不能得到确切的价值。 这与浮点数的根本问题。
你可以强制与十进制数的固定数量的toFixed
:
alert(total.toFixed(2));
但是,请记住,这将离开尾随零,你可能不希望。 你可以删除它们.replace(/0+$/,'');
如果你试图显示这个数字,你都可以转换成一个字符串toFixed(1) 。 如果你这样做,跟踪类型的,因为你不能再乘以另一个数字的字符串。
如果你打算在其他计算来使用它,你可以把它截断到小数点后一位:
Math.round( total * 10 ) / 10
然而,正如不同的人所指出的,不精确的值是现在的样子浮点数是。
参见更多良好的信息的评论链接的问题。
我找到了答案通过以下页面,感谢迪米特里 :
浮点速查表为JavaScript
我决定,因为我需要操作的精确值,他们是与金钱有关的操作使用以下clases:
这样能很好地与外部库调用来完成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>
这里是一个变通的解决方案浮点数的乘法。 这是很简单,但对我的作品。 你找出数多少小数有这个功能。
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是你的号码
total.toFixed(2)
可能会有帮助。 但需要注意的是, total
变量是将类型强制转换为字符串。
试一试
var x = 0.07;
console.log((x+1)*100 - 100);
现在,对于其它值代替x的值;-)
运算符“*”和“/”不工作总是完美,例如:
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
你可以这样做
var total = +(percent*m1).toPrecision(15);
223.2 === total; // true
223.2 === 0.1*2232.00; // false
如果您使用的角度,我做了一个组件,用于此。
与亭子安装
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>
我发现了一个很简单的解决方案。 在*
运算符是一个有点坏了,当涉及到十进制数,但/
运营商不可。 乘法可以由于•B很容易地转化为司= A /(1 / B)
function times(a, b) { return a/(1/b) }
只需更换percent * m1
与times(percent, m1)
更新:它不工作,所有的时间。
我结束了以下解决方案:
function decimalmultiply(a, b) {
return parseFloat((a * b).toFixed(12));
}
10.50*30.45=319.72499999999997
decimalmultiply(10.50,30.45)=319.725
该方法返回一个数 ,而不是字符串 ,不截断显著小数(最多12个)。