-
19-09-2019 - |
题
我有一个函数圆赋予功能为最接近的整便士数目。
<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
我认为这将只是改变的情况下 返回(Math.round(一 C)/ C); 至 返回(Math.ceil(一 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(这是前一阵子了)但我仍然没有更好的现在,因为我是当时的情况。
任何人都可以清理,看看他们是否能看到为什么它不工作,以配合上面的功能?
解决方案
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
我把它给你在这种情况下想要的结果。不知道这是怎么回事,每次工作,但它似乎。我肯定会检查它的工作原理,你想让它第一。
其他提示
有是这个内置的功能已经, Number.toFixed(numDigits)
一>,为什么不使用此?
<强>参数:数字强>结果 小数点后出现的数字的位数;这可以是0至20(含)之间的值,和实施方式可以可选地支持更大的范围的值。如果省略该参数,它被视为0。
<强>返回:强>结果 一些字符串表示,不采用指数计数法,并且具有小数点后的数字准确的数字。如果需要的数量是圆形的,并且如果必要的,使得它具有指定长度的小数部分被用零填充。如果数目大于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)如果(号码(x.charAt(INDEXOF( “”)+ 1))> 4){X + = 1}其中x是数目
3)parseInt函数
4)除以100和完成的操作。
建议使用定点算术是好的建议。不幸的是,在Javascript中没有定点运算 - 所有的数字都是双精度浮点数。 (当然,没有定点运算,而不在一些明确的支持库拉动。)
有关在文本字段输入擦洗,我已经开始用数字处理的字符串(以任何程度可能的)。印章的输入成的部件的左侧和小数点右边,则在整数值工作(通过Math.floor()必要时)。如果你有对付流浪位过去小数点第2位,要么把他们当作一个错误(它们意味着什么呢?),否则,再次拆分它们赶走,并与他们为整数的工作。
如果你的不可以处理用户提供的值(即从文本输入字段的东西),那么你真的不应该在Javascript中这样做,因为,同样,你不”吨有你真正需要的数字工具。
与Math.round()
更换Math.ceil()
应该工作:该错误一定在别处
另外,我建议完全丢弃isNaN(parseInt())
的数学函数将转换为数字反正返回NaN
如果那是不可能的。这将导致该函数返回NaN
为好,这是一个比布尔false
更好的配合。
和BTW:这是一个坏主意,使用浮点运算与货币价值:使用定点算术,而不是
!现在,我们知道你想做什么,这里的后者计算所需的值,你的例子代码:
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;
没有,你是对的。
我测试代码与细胞修饰,和它的工作原理。