在基地10舍入

时间:2009-10-01 16:43:40

标签: javascript math number-manipulation

我有一个函数可以将给定函数的数字舍入到最近的整数便士。

<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>

但是我注意到输入到函数中的所述数字必须四舍五入到最接近的一个便士,但它必须四舍五入到小数点后两位。

E.G。

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

我认为这只是一个改变的例子     return(Math.round(a c)/ c); 至     return(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

任何人都可以对某个功能进行上述操作吗?

Here是我当前代码的链接,包括公式...这是我在第一次启动JavaScript时制作的一个非常古老的公式(现在还不久)但是我仍然没有我现在回来的时候好多了。

任何人都可以清理它,看看它们是否可以看出为什么它不能与上述功能相匹配?

6 个答案:

答案 0 :(得分:5)

有一个内置函数,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 :(得分:1)

您的代码比此任务所需的代码更复杂。如果你知道小数点总是代表一个稳定的值,无论小数点两边的数字长度如何,你都很幸运。

1)然后你必须将原始数字加倍100

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

3)parseInt

4)除以100,你就完成了。

答案 2 :(得分:1)

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;

答案 3 :(得分:1)

使用定点算术的建议是很好的建议。不幸的是,Javascript中没有定点算术 - 所有数字都是双精度浮点数。 (好吧,没有定义支持库,没有定点算法。)

对于在文本字段中清理输入,我已经开始将数字作为字符串处理(在任何可能的范围内)。将输入切换到小数点左侧和右侧的部分,然后使用整数值(必要时通过Math.floor())。如果你必须处理超过小数点后第二位的杂散数字,要么将它们视为错误(它们的意思是什么?)或者再次将它们拆分并作为整数使用它们。

如果你处理用户提供的值(即来自文本输入字段的东西),那么你真的不应该在Javascript中这样做,因为,再次,你不要你有真正需要的数字工具。

答案 4 :(得分:0)

不,你是对的。

我使用单元格修改测试了您的代码,它可以正常工作。

答案 5 :(得分:0)

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

在这种情况下,我得到了你想要的结果。不确定它是否每次都能正常工作但似乎。我肯定会检查它是否有效,因为你想要它。