1

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

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

然而,我注意到输入到函数中的上述数字只能四舍五入到最接近的一便士,但必须四舍五入到小数点后两位。

例如

15.236562213541684 = 15.24  
9846.65456169846 = 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 时制定的一个非常古老的公式(这是不久前的事了)但是我现在仍然没有更好,因为我那时.

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

4

6 回答 6

5

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

参数:digits
小数点后出现的位数;这可以是 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

于 2009-10-01T16:46:17.053 回答
1

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

1)然后你只需将你的原始数字乘以 100

2) if (Number(x.charAt(indexOF(".") + 1)) > 4) {x += 1} 其中 x 是你的号码

3) 解析整数

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

于 2009-10-01T16:47:05.747 回答
1

替换Math.round()Math.ceil()应该工作:错误必须在其他地方。

另外,我建议完全放弃,isNaN(parseInt())因为数学函数无论如何都会转换为数字,NaN如果不可能,则返回。这也将导致函数返回NaN,这比 boolean 更适合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;
于 2009-10-01T17:48:41.670 回答
1

使用定点算术的建议是很好的建议。不幸的是,Javascript 中没有定点运算——所有数字都是双精度浮点数。(好吧,如果不引入一些显式支持库,就没有定点算术。)

为了清理文本字段中的输入,我已经开始将数字作为字符串处理(尽可能地)。将输入分成小数点左右的部分,然后以整数值工作(必要时通过 Math.floor() )。如果您必须处理小数点后第二位的杂散数字,请将它们视为错误(它们到底是什么意思?),或者再次将它们分开并将它们作为整数处理。

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

于 2009-10-01T18:32:57.303 回答
0

不,你是对的。

我用 ceil modifictaion 测试了你的代码,它可以工作。

于 2009-10-01T16:49:57.153 回答
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

在这种情况下,我得到了你想要的结果。不确定它是否每次都有效,但似乎有效。我肯定会先检查它是否按您的意愿工作。

于 2009-10-01T19:24:15.557 回答