Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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 JS:如何在保持n个有意义的数字的同时简化列表的精确数字?_Javascript_Math - Fatal编程技术网

Javascript JS:如何在保持n个有意义的数字的同时简化列表的精确数字?

Javascript JS:如何在保持n个有意义的数字的同时简化列表的精确数字?,javascript,math,Javascript,Math,我想清理一个大JSON,里面满是超精确的数字 给定的数字既有大量的小数,又有很大的可变性,例如: set 1: w: 984.4523354645713, h: 003.87549531298341238; set 2: x: 0.00023474987546783901386284892, y: 0.000004531457539283543; 考虑到我想简化它们,并以相同的精度存储它们,让我们假设4个有意义的数字,在最大值上对齐 我想要这样的东西: set 1: w: 984.5, h

我想清理一个大JSON,里面满是超精确的数字

给定的数字既有大量的小数,又有很大的可变性,例如:

set 1:
w: 984.4523354645713, 
h: 003.87549531298341238;

set 2:
x: 0.00023474987546783901386284892,
y: 0.000004531457539283543;
考虑到我想简化它们,并以相同的精度存储它们,让我们假设4个有意义的数字,在最大值上对齐

我想要这样的东西:

set 1:
w: 984.5,
h: 003.9;

set 2:
x: 0.0002347,
y: 0.0000045;
为了我所有的数百套和数千个数字

如何简化此列表中的数字,同时保持n个有意义的数字(按最大数字对齐)?请参阅

输出(精确对齐!):

w: 984.4523354645713, 
h: 003.87549531298341238; 
w_(rounded): 984.5, 
h_(rounded):   3.9;

大规模编辑

此函数将执行您想要的操作:

function get_meaningful_digit_pos(digits, val1, val2) {
    var max = Math.max.apply(null, [val1, val2].map(function(n) {
            return Math.abs(n);
        })),
        digit = Math.pow(10, digits),
        index = 0;

    // For positive numbers, check how many numbers there are
    // before the dot, then return the negative digits left.
    if (max > 0) {
        while (digit > 1) {
            if (max >= digit) {
                return -digits;
            }

            digits--;
            digit /= 10;
        }
    }

    // Loop 15 times at max; after that in JavaScript a double
    // loses its precision.
    for (; index < 15 - digits; index++) {
        if (0 + max.toFixed(index) !== 0) {
            return index + digits;
        }
    }
}

003.87549531298341238
是否会四舍五入到
3.9
?是的!打字错误!好的,另一个问题,数字能大于1000吗?如果是这样的话,数字会发生什么变化?注意:您的方法类似于
.toFixed(3)
。我的问题更多的是让不同的数字集合与集合中最大的一个保持一致,然后也会问一个
If
循环。@Hugolpz对不起,我不完全理解你到底在问什么。你所说的“与最大的一组对齐”是什么意思?你是说你想首先获取JSON数据的最大价值吗?我重新编辑了这个问题。这基本上是一种数据必须简化的情况。每行应保留4个有意义的数字,以最大的项目为基础。@broxier:我已经有了一个解决方案,但它总是很有趣,并以其他方式来实现。@Hugolpz这花了一些时间,但很有趣!我重写了我的全部答案,希望这能有所帮助。:)
function get_meaningful_digit_pos(digits, val1, val2) {
    var max = Math.max.apply(null, [val1, val2].map(function(n) {
            return Math.abs(n);
        })),
        digit = Math.pow(10, digits),
        index = 0;

    // For positive numbers, check how many numbers there are
    // before the dot, then return the negative digits left.
    if (max > 0) {
        while (digit > 1) {
            if (max >= digit) {
                return -digits;
            }

            digits--;
            digit /= 10;
        }
    }

    // Loop 15 times at max; after that in JavaScript a double
    // loses its precision.
    for (; index < 15 - digits; index++) {
        if (0 + max.toFixed(index) !== 0) {
            return index + digits;
        }
    }
}
get_meaningful_digit_pos(4, 1234, 0.0);          // -3
get_meaningful_digit_pos(4, 12.000001234, 0.0);  // -1
get_meaningful_digit_pos(4, 1.234, 0.0);         // 0
get_meaningful_digit_pos(4, 0.1234, 1.0);        // 0
get_meaningful_digit_pos(4, 0.0000001234, 0.0);  // 7
get_meaningful_digit_pos(4, 0.0000001234, 10.0); // -1