Javascript 如何在JS中平滑地舍入百分比

Javascript 如何在JS中平滑地舍入百分比,javascript,math,rounding,Javascript,Math,Rounding,我有一个包含小数值的对象:evo、meteo和usage 我尝试在三个条件下显示此值: 值可以是正的,也可以是负的 值必须显示为百分比,不带任何小数 (A) 一定是真的 (A) :Math.round(meteo*100)+Math.round(用法*100)=Math.round(evo*100) 例如,如果我们对这些值应用 {evo: 0.1466, meteo: 0.1231, usage: 0.0235} 我们将获得未验证的百分比: evo: 15% meteo: 12% usag

我有一个包含小数值的对象:
evo
meteo
usage
我尝试在三个条件下显示此值:

  • 值可以是正的,也可以是负的
  • 值必须显示为百分比,不带任何小数
  • (A) 一定是真的
(A) :
Math.round(meteo*100)+Math.round(用法*100)=Math.round(evo*100)

例如,如果我们对这些值应用

{evo: 0.1466, meteo: 0.1231, usage: 0.0235}
我们将获得未验证的百分比:

evo: 15%
meteo: 12%
usage: 2%
因为值是四舍五入的,所以有时(A)未经验证。 我正在使用一个getSmooth函数来调整舍入值,以得到方程(a)的始终验证

var smooth = getSmooth(Math.round(evo*100), Math.round(meteo*100), Math.round(usage*100);

function getSmooth(evo, meteo, usage){
    // case we need to incremente something
    if( Math.abs(evo) > Math.abs(meteo) + Math.abs(usage) ){
        // case we need to incremente usage
        if( Math.abs(meteo) > Math.abs(usage) ){
            (usage > 0) ? usage++ : usage--;
        }
        // case we need to incremente meteo
        else{
            (meteo > 0) ? meteo++ : meteo--;
        }
    }
    // case we need to decremente something
    else{
        // case we need to decremente usage
        if( Math.abs(meteo) > Math.abs(usage) ){
            (usage > 0) ? usage-- : usage++;
        }
        // case we need to decremente meteo
        else{
            (meteo > 0) ? meteo-- : meteo++;
        }
    }

    return {
        evo: evo,
        meteo: meteo,
        usage: usage
    };
}
我的函数工作不好,它只处理+1递增/递减。 我很确定我做得很艰难

有没有更简单的方法来完成这项任务?

试试这个:

function getSmooth(meteo, usage) {
    meteo = Math.round(meteo*100);
    usage = Math.round(usage*100);
    return {
        evo: (meteo + usage) / 100,
        meteo: meteo / 100,
        usage: usage / 100
    };
}
要测试
evo
中的计算错误,请与可视化逻辑分开:

var evo, meteo, usage;
// ...
// do the error handling
var eps = 1e-4; // some float precision epsilon
if(Math.abs(evo - (meteo + usage)) > eps) {
     // there's an error in evo...
}
// now do the processing
var smooth = getSmooth(meteo, usage);
// continue with smooth...
试试这个:

function getSmooth(meteo, usage) {
    meteo = Math.round(meteo*100);
    usage = Math.round(usage*100);
    return {
        evo: (meteo + usage) / 100,
        meteo: meteo / 100,
        usage: usage / 100
    };
}
要测试
evo
中的计算错误,请与可视化逻辑分开:

var evo, meteo, usage;
// ...
// do the error handling
var eps = 1e-4; // some float precision epsilon
if(Math.abs(evo - (meteo + usage)) > eps) {
     // there's an error in evo...
}
// now do the processing
var smooth = getSmooth(meteo, usage);
// continue with smooth...

如果您希望保持
evo
值的准确性,而不是基于
meteo
使用量的总和进行计算,那么这里有一种不同的方法。(这比使用evo=metro+usage有点难看)

查看
meteo
用法的小数点,然后根据结果使用
.ceil()
.floor()

var smooth = getSmooth(evo, meteo, usage);

function getSmooth(evo, meteo, usage){

    evo   *= 100;
    meteo *= 100;
    usage *= 100;

    var meteo_decimal = meteo % 1;
    var usage_decimal = usage % 1;

    evo = Math.round(evo);

    if( meteo_decimal > usage_decimal ) {
        meteo = Math.ceil(meteo);
        usage = Math.floor(usage);
    } else {
        meteo = Math.floor(meteo);
        usage = Math.ceil(usage);
    }

    return {
        evo: evo / 100,
        meteo: meteo / 100,
        usage: usage / 100
    };
}

如果您希望保持
evo
值的准确性,而不是基于
meteo
使用量的总和进行计算,那么这里有一种不同的方法。(这比使用evo=metro+usage有点难看)

查看
meteo
用法的小数点,然后根据结果使用
.ceil()
.floor()

var smooth = getSmooth(evo, meteo, usage);

function getSmooth(evo, meteo, usage){

    evo   *= 100;
    meteo *= 100;
    usage *= 100;

    var meteo_decimal = meteo % 1;
    var usage_decimal = usage % 1;

    evo = Math.round(evo);

    if( meteo_decimal > usage_decimal ) {
        meteo = Math.ceil(meteo);
        usage = Math.floor(usage);
    } else {
        meteo = Math.floor(meteo);
        usage = Math.ceil(usage);
    }

    return {
        evo: evo / 100,
        meteo: meteo / 100,
        usage: usage / 100
    };
}


如果你先四舍五入,然后再加上,我不相信你能保证平等(你称之为“A必须是真的”)。Math.round(val*100)/100;有什么原因你不能以更高的精度显示百分比吗?你有没有一个例子说明你的函数工作不正常?@RowlandShaw,可用的UX空间只能显示两个数字,MaximePeloquin,我已经给出了一个,如果你先四舍五入,然后再加上,我不相信你能保证相等(你所说的)“A必须为真”。)数学圆(val*100)/100;有什么原因你不能以更高的精度显示百分比吗?你有没有一个例子说明你的函数工作不正常?@RowlandShaw,可用的UX空间只能显示两个数字,MaximePeloquin,我已经给出了一个,很好的一个,但我不想使用这个。如果我们在evo上有calc错误,我们不会看到它使用这个接口。@BigDong只需在调用级别进行检查。我已经在作为报告日志进行检查,但操作员仍需要注意。@BigDong您可以在错误情况下覆盖evo,但您可能希望执行与向操作员显示错误结果不同的操作…很好,但我不希望使用此操作。如果我们在evo,我们不会用这个界面看到它。@BigDong只是在调用级别检查一下我已经在做报告日志了,但是操作员还是需要注意。@BigDong您可以在错误情况下覆盖evo,但是您可能想做一些不同于向操作员显示错误结果的事情……啊,是的,很好的一点,您必须重新开始我想这一个。试图想一个不同的,它不同于你的,包含了evo的价值。现在改变了它,但它只是变得更丑陋。对,应该这样做,但仍然是最好的方式做它是因为你之前的回答。只是出于好奇,试图用evo的真正价值来做。啊,是的,很好的一点,将不得不重新思考这一个。试着去想一个与你不同的,包含evo价值的东西。现在改变了它,但它变得更丑陋了。没错,应该这样做,但最好的方法还是像你之前回答的那样。只是出于好奇,我试着用evo的真正价值来做。