Javascript 将数字四舍五入至3的最接近倍数
嘿,我该怎么把一个数字四舍五入到最接近的3的倍数呢 即 如果(n>0),谢谢 return Math.ceil(n/3.0)*3; else if(n<0) 返回数学楼层(n/3.0)*3; 其他的 返回3; (n-n模块3)+3给你Javascript 将数字四舍五入至3的最接近倍数,javascript,integer,rounding,Javascript,Integer,Rounding,嘿,我该怎么把一个数字四舍五入到最接近的3的倍数呢 即 如果(n>0),谢谢 return Math.ceil(n/3.0)*3; else if(n
Number.prototype.roundTo = function(num) {
var resto = this%num;
if (resto <= (num/2)) {
return this-resto;
} else {
return this+num-resto;
}
}
此函数将四舍五入到您提供的任何因子的最近倍数。 它不会对0或已经是倍数的数字进行取整
round_up = function(x,factor){ return x - (x%factor) + (x%factor>0 && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
0
round_up(6,3)
6
0的行为不是您所要求的,但通过这种方式似乎更加一致和有用。但是,如果确实要将0四舍五入,则以下函数将执行此操作:
round_up = function(x,factor){ return x - (x%factor) + ( (x%factor>0 || x==0) && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
3
round_up(6,3)
6
我用psuedocode回答这个问题,因为我主要用SystemVerilog和Vera(ASIC HDL)编程表示模函数
round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
这在任何情况下都有效
数字的模数计算余数,从除数中减去余数,得到下一个除数倍数所需的数字,然后“神奇”出现。你可能会认为使用单模函数就足够了,但是如果这个数是除数的精确倍数,它会计算出一个额外的倍数。也就是说,24会返回27。附加模量通过使加法为0来防止这种情况。简单地说:
3.0*Math.ceil(n/3.0)
?
$(文档).ready(函数(){
var模数=3;
对于(i=0;i<21;i++){
$(“#结果”)。追加(“”+汇总(i,模数)+“ ”)
}
});
函数汇总(数字、模数){
var余数=数%模数;
如果(余数==0){
返回号码;
}否则{
返回数+模-余数;
}
}
四舍五入至3的最接近倍数:
如对已接受答案的评论中所述,您可以使用以下内容:
数学单元(x/3)*3
(即使当x
为0时它不会返回3,因为这可能是OP的错误。)
在此之前发布的九个答案中(未被删除或分数不太低,所有用户都看不到),只有迪安·尼科尔森(失去重要性的问题除外)和博布里耶的答案是正确的。被接受的答案给出了负数的错误结果,它为0添加了一个例外,以解释OP可能犯的错误。另外两个答案将数字四舍五入到最近的倍数,而不是总是四舍五入,另一个答案给出了负数的错误结果,还有三个甚至给出了错误的正数结果。在@Makram方法的基础上,结合@Adam随后的评论,我修改了原始Math.prototype示例,以便在以零为中心和无偏系统中准确地舍入负数:
Number.prototype.mround = function(_mult, _zero) {
var bias = _zero || false;
var base = Math.abs(this);
var mult = Math.abs(_mult);
if (bias == true) {
base = Math.round(base / mult) * _mult;
base = (this<0)?-base:base ;
} else {
base = Math.round(this / _mult) * _mult;
}
return parseFloat(base.toFixed(_mult.precision()));
}
Number.prototype.precision = function() {
if (!isFinite(this)) return 0;
var a = this, e = 1, p = 0;
while (Math.round(a * e) / e !== a) { a *= 10; p++; }
return p;
}
Number.prototype.mround=函数(\u mult,\u zero){
var偏差=_零| |假;
var base=Math.abs(本);
var mult=数学abs(_mult);
如果(偏差==真){
基数=数学圆(基数/倍数)*\u倍数;
基数=这是一个更一般的答案,它可能会帮助一个更一般的问题:如果你想把一个小数乘以一个数,考虑使用一个库。这是一个在GUI中有效的用例,其中小数类型被输入到输入中,例如你想把它们强制为0.25、0.2、0.5的倍数等等。法尔:
function roundToStep(value, step) {
return Math.round(value / step) * step;
}
console.log(roundToStep(1.005, 0.01)); // 1, and should be 1.01
在花了几个小时试图编写自己的函数并查找npm包之后,我决定立即完成这项工作。它甚至有一个toNearest
方法来完成这项工作,您可以选择是向上取整、向下取整还是更接近值(默认值)
使用余数运算符(模数):
如果我们有7个,我们想要9,7/3=2.33333,ceil(2.3333)=3,3*3=9.我是否遗漏了什么?Cambium是对的-它是有效的,因为它将n/3四舍五入到最接近的整数,然后再乘以3。看起来要求是错误的,但这不一定由开发人员来决定。给客户他们想要的,然后就后续的更改向他们收取费用;)@PaulJWilliams:但是由于客户的要求与问题陈述不一致,唯一可能的答案是{25:27,1:3,0:3,6:6}[x]
。即使您忽略x=0
的情况,如果-3明显小于-1,-1如何舍入到-3?对所述问题的正确答案是Math.ceil(x/3)*3
.0将返回3???为什么?javascript的mod运算符的可能重复为%,此外,它将(错误地)对已经是3的倍数的偶数进行取整。。不满足(mad)当n==0时的要求。这实际上是对这个问题的唯一正确答案。什么?x/3 | 0
与Math.floor(x/3)
相同,只是根据计算速度慢了27%。此外,如果x=-4
,那么它输出0,这显然是不正确的,无论你如何定义舍入。Number(1)。roundTo(3)
返回0。@OrangeDog这太完美了!在您的示例中,1.6或更大的值应得到3。较小的数字将得到0。问题明确指出(并给出了示例)所有数字都应向上舍入。else语句是无用的函数roundUpMultiple(num,div){return num+((div-(num%div))%div)}
这会导致小于0但大于-1的数字失去显著性,因此,例如n=-.1;d=3;n+(d-n%d)%d
返回8.32667268688674e-17
。此方法也可用于向下舍入(而不是向上舍入)通过使d
为负值,使d
的倍数,但随后它会导致大于0但小于1的数字失去意义,因此d=-3;[-3,-1,-.1,0,1,3].map(函数(x){return x+(d-x%d)%d}
返回[-3,-3,0,-8.326674688674e-17,3]
round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
3.0*Math.ceil(n/3.0)
Number.prototype.mround = function(_mult, _zero) {
var bias = _zero || false;
var base = Math.abs(this);
var mult = Math.abs(_mult);
if (bias == true) {
base = Math.round(base / mult) * _mult;
base = (this<0)?-base:base ;
} else {
base = Math.round(this / _mult) * _mult;
}
return parseFloat(base.toFixed(_mult.precision()));
}
Number.prototype.precision = function() {
if (!isFinite(this)) return 0;
var a = this, e = 1, p = 0;
while (Math.round(a * e) / e !== a) { a *= 10; p++; }
return p;
}
function roundToStep(value, step) {
return Math.round(value / step) * step;
}
console.log(roundToStep(1.005, 0.01)); // 1, and should be 1.01
const Decimal = require("decimal.js")
function roundToStep (value, step) {
return new Decimal(value).toNearest(step).toNumber();
}
console.log(roundToStep(1.005, 0.01)); // 1.01
(n - 1 - (n - 1) % 3) + 3