Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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 angularjs的奇怪行为_Javascript_Angularjs_Typed Arrays - Fatal编程技术网

Javascript angularjs的奇怪行为

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

我注意到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.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));
      }
    }
  }
})