Javascript angularjs的奇怪行为
我注意到angularjs在使用Float32Array值时的一些不太好的行为 基本上我测试了这三个Javascript angularjs的奇怪行为,javascript,angularjs,typed-arrays,Javascript,Angularjs,Typed Arrays,我注意到angularjs在使用Float32Array值时的一些不太好的行为 基本上我测试了这三个 angular.module("myApp", []).controller("myCtrl", function($scope) { $scope.n = 0.2; // Displays as 0.2 $scope.arr1 = new Float32Array(1); $scope.arr1[0] = 0.2; // 0,20000000298023224 $scope.a
angular.module("myApp", []).controller("myCtrl", function($scope) {
$scope.n = 0.2; // Displays as 0.2
$scope.arr1 = new Float32Array(1);
$scope.arr1[0] = 0.2; // 0,20000000298023224
$scope.arr2 = new Float64Array(1);
$scope.arr2[0] = 0.2; // Displays as 0.2
});
我确实理解0.2作为二进制分数周期性的问题
但是,您知道如何告诉toString方法(或其他函数)考虑较低的精度,并在适当的时候对小数进行四舍五入吗
这是我添加的指令,以使其更好一些(但仍然不是很好):
指令(“numberfloat”,函数(){
返回{
作用域:{n:'=model},
模板:“”,
链接:功能($scope){
$scope.m=函数(newVal){
if(newVal){
$scope.n=newVal;
}
返回parseFloat($scope.n.toFixed(4));
}
}
}
})
您可以使用来固定模板本身(即视图层本身)中显示的数字的精度
e、 g.{{arr1[0]| number:2}
将精度固定在小数点后2位
演示:谢谢,但这是显而易见的部分——更棘手的部分是另一种方式,它使输入变得不可能。我在(现在更新的plunker)中提出了解决方案,但偶尔它仍然会因为一些大数字而变得不可用,而您根本无法编辑这些数字。我可能会在内部存储64位数字,并在需要时将其转换为32位数字。好吧,真正令人讨厌的是,最终即使是Float64Array在输入某些内容时也会表现出不同的行为-例如,它不可能只包含负号(
.directive("numberfloat", function(){
return {
scope: {n: "=model"},
template: '<input type="number" ng-model="m" ng-model-options="{getterSetter: true}"/>',
link: function($scope){
$scope.m = function(newVal){
if(newVal){
$scope.n = newVal;
}
return parseFloat($scope.n.toFixed(4));
}
}
}
})