繁体   English   中英

以10为基数取整

[英]rounding in base 10

我有一个函数,将赋予函数的数字四舍五入到最接近的整便士。

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

但是,引起我注意的是,输入到函数中的数字必须四舍五入到最接近的1便士,但是必须四舍五入到小数点后两位。

例如

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

我认为这只是改变回报的情况(Math.round(a c)/ c); 返回(Math.ceil(a c)/ c);

显然我错了。

在这件事上有帮助吗?

**编辑**

这是我尝试实现的公式,可能会有所帮助

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

例如

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

任何人都可以执行上述功能吗?

是到我当前代码的链接,其中包括公式...这是我第一次启动JavaScript时(这是前一阵子)创建的一个非常旧的公式,但是现在我还是再好不过了。

任何人都可以清理它,看看他们是否可以看到为什么它无法与上述功能匹配?

已经有一个内置函数Number.toFixed(numDigits) ,为什么不使用它呢?

参数:数字
小数点后出现的位数; 该值可以是0到20之间(含0和20)的值,并且实现方式可以选择支持更大范围的值。 如果省略此参数,则将其视为0。

返回值:
数字的字符串表示形式,该形式不使用指数表示法,并且在小数点后第一个数字位具有正好数字。 如果需要,数字会四舍五入,如果需要,小数部分将用零填充,以便具有指定的长度。 如果number大于1e + 21,则此方法仅调用Number.toString()并以指数表示法返回字符串。

例:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

这最后一个不符合您的例子- 9846.65456169846四舍五入至小数点后两位应该是9846.65 ,而不是9846.66

您的代码比完成此任务所需的代码复杂。 如果您知道小数点将始终代表一个稳定值,而不管该小数点两侧的位数如何,那么您很幸运。

1)然后,您只需将原始号码乘以100

2)if(Number(x.charAt(indexOF(“。”)+ 1))> 4){x + = 1}其中x是您的数字

3)parseInt

4)除以100,就可以了。

更换Math.round()Math.ceil()应该工作:这个错误一定在别处。

另外,我建议完全删除isNaN(parseInt())因为数学函数无论如何都会转换为数字,如果不可能的话,返回NaN 这也将导致函数返回NaN ,这比布尔false更适合。

顺便说一句:使用带有货币值的浮点数学是一个坏主意:改用定点算法!


现在我们知道您要做什么,下面是为示例计算所需值的代码:

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

对于所有计算,将round()更改为ceil()均无效,因为最后一次付款通常必须四舍五入以补偿由于使用浮点值而引起的不准确性。

通常最好只使用整数数学,因此将所有值乘以100并仅在输出值时进行转换:

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

使用定点算术的建议是很好的建议。 不幸的是,JavaScript中没有定点算术-所有数字都是双精度浮点数。 (好吧,如果不引入一些明确的支持库,就无法进行定点运算。)

为了清理文本字段中的输入,我已经开始将数字作为字符串处理(尽可能)。 将输入切成小数点左边和右边的部分,然后使用整数值(必要时通过Math.floor())。 如果您必须处理超过小数点后两位的流浪数字,请将其视为错误(无论如何意味着错误),否则,请再次将其拆分并作为整数使用。

如果您处理用户提供的值(例如,文本输入字段中的内容),那么您实际上不应该在Javascript中进行此操作,因为同样,您没有真正需要的数字工具。

不,你说得对。

我用ceil修改测试了您的代码,它可以工作。

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

在这种情况下,我得到了想要的结果。 不知道它是否每次都能正常工作,但似乎可以。 我一定会先检查一下它是否可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM