如何舍入Java中的数字?


228

如何在JavaScript中四舍五入一个数字?

math.round() 不起作用,因为它将四舍五入到最接近的小数。

我不确定除了保留小数点后保留第一位以外,是否还有更好的方法。必须有...


21
向零或负无穷大舍入?
DanielBrückner09年

Answers:



60

向负无穷大舍入- Math.floor()

+3.5 => +3.0
-3.5 => -4.0

Truncate()可以通过使用Math.ceil()负数和Math.floor()正数来模拟向零舍入(通常称为,但JavaScript不支持)。

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()

谢谢您的完整性,但是大写是错误的...并且在Java脚本中有很大的不同。否则我会在这里投票。
乔治

我已经更新了答案,以便大写现在正确。
chasen 2012年

18
@乔治巨大还是巨大?:D
m93a

1
您可以通过获得与四舍五入相同的效果x | 0
艾哈迈德·法西

28

Math.floor() 可以工作,但是与按位使用相比非常慢 OR操作:

var rounded = 34.923 | 0;
alert( rounded );
//alerts "34"

编辑 Math.floor()慢于使用| 操作员。感谢Jason S检查我的工作。

这是我用来测试的代码:

var a = [];
var time = new Date().getTime();
for( i = 0; i < 100000; i++ ) {
    //a.push( Math.random() * 100000  | 0 );
    a.push( Math.floor( Math.random() * 100000 ) );
}
var elapsed = new Date().getTime() - time;
alert( "elapsed time: " + elapsed );

11
??? 我只是运行了使用Spidermonkey 1.7的jsdb(www.jsdb.org),并运行了一个循环,以对100000个浮点数的数组中x [i]的底数求和,首先使用Math.floor(),然后按位或按照您的建议。大约花费了125毫秒的时间。
杰森S

4
刚刚用500000个浮点数重复了测试,大约花费了大约625毫秒的时间。
杰森S

5
所以我看不到1.25usec是多么慢。
杰森S

3
不能与您的数据争论不休:)我想我可能将JS的实现与ActionScript的实现(基于EcmaScript构建;显然实现不同)相混淆。感谢您检查我的工作!
geraldalewis

14
他们也不会做同样的事情。|转换为32位整数,截断;Math.floor四舍五入。jsfiddle.net/minitech/UVG2w
Ry-

21

如果需要舍入到小数位数后的位数,可以尝试使用此功能。

function roundDown(number, decimals) {
    decimals = decimals || 0;
    return ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals) );
}

例子

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990

我认为像这样的单线不需要功能。
Hubert Grzeskowiak 2015年

4
roundDown(4.56,2)为您提供4.55,所以我认为这不是一个很好的解决方案。
2016年

6

要向下取整为负无穷大,请使用:

rounded=Math.floor(number);

要向下舍入为零(如果数字可以舍入为-2147483648和2147483647之间的32位整数),请使用:

rounded=number|0;

要舍入为零(对于任何数字),请使用:

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

5

可以通过减去其有符号的小数部分来number对取整:0number % 1

rounded = number - number % 1;

Math.floor(朝方向四舍五入-Infinity)一样,此方法非常准确。

有在处理分歧-0+Infinity并且-Infinity尽管:

Math.floor(-0) => -0
-0 - -0 % 1    => +0

Math.floor(Infinity)    => Infinity
Infinity - Infinity % 1 => NaN

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN

3
Math.floor(1+7/8)

1 + 7/8 = 1-那里不需要Math.floor():)
Jason Berry

18
实际上是(7/8)+1而不是1。谢谢3年级代数
Joe Phillips

1
嗯,请实际在JavaScript程序中尝试一下。是的 显示(1 + 7/8),您将看到1.875。Math.round(...)是2,Math.floor(...)是1。你们在说什么?
DigitalRoss

1
或打开Firefox错误控制台。或萤火虫。不难尝试。我尝试过这个。1 + 7/8在js中为1.875。您是否可能忘记了js中的所有数学运算都是浮点数?
DigitalRoss

3
可能很容易忘记javascript在浮点中完成了所有操作。在许多其他语言中,1 + 7/8为1,但在js中,实际值为1.875。
DigitalRoss

3

今天与别人的代码摆弄整齐,发现以下内容似乎也四舍五入:

var dec = 12.3453465,
int = dec >> 0; // returns 12

有关符号传播右移(>>)的更多信息,请参见MDN按位运算符

我花了一段时间才弄清楚这是做什么的:D

但是正如上面突出显示的那样,我认为Math.floor()可以正常工作,并且看起来更具可读性。


3
如果数字不适合32位,它也会无声地杀死您的号码。铬控制台:99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

您需要将-1向下舍入一半,然后再乘以-1,如下面的示例所示。

<script type="text/javascript">

  function roundNumber(number, precision, isDown) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = 0;
    if (isDown) {
      tempNumber = -tempNumber;
      roundedTempNumber = Math.round(tempNumber) * -1;
    } else {
      roundedTempNumber = Math.round(tempNumber);
    }
    return roundedTempNumber / factor;
  }
</script>

<div class="col-sm-12">
  <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script>
  </p>
  <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p>
</div>

老实说,在这个社区中,我们更喜欢上面给出的@phoebus之类的答案。
Ankit Pandey

0

这是在简单示例中使用的math.floor。这可能有助于新开发人员了解如何在函数中使用它以及它做什么。希望能帮助到你!

<script>

var marks = 0;

function getRandomNumbers(){    //  generate a random number between 1 & 10
    var number = Math.floor((Math.random() * 10) + 1);
    return number;
}

function getNew(){  
/*  
    This function can create a new problem by generating two random numbers. When the page is loading as the first time, this function is executed with the onload event and the onclick event of "new" button.
*/
document.getElementById("ans").focus();
var num1 = getRandomNumbers();
var num2 = getRandomNumbers();
document.getElementById("num1").value = num1;
document.getElementById("num2").value = num2;

document.getElementById("ans").value ="";
document.getElementById("resultBox").style.backgroundColor = "maroon"
document.getElementById("resultBox").innerHTML = "***"

}

function checkAns(){
/*
    After entering the answer, the entered answer will be compared with the correct answer. 
        If the answer is correct, the text of the result box should be "Correct" with a green background and 10 marks should be added to the total marks.
        If the answer is incorrect, the text of the result box should be "Incorrect" with a red background and 3 marks should be deducted from the total.
        The updated total marks should be always displayed at the total marks box.
*/

var num1 = eval(document.getElementById("num1").value);
var num2 = eval(document.getElementById("num2").value);
var answer = eval(document.getElementById("ans").value);

if(answer==(num1+num2)){
    marks = marks + 10;
    document.getElementById("resultBox").innerHTML = "Correct";
    document.getElementById("resultBox").style.backgroundColor = "green";
    document.getElementById("totalMarks").innerHTML= "Total marks : " + marks;

}

else{
    marks = marks - 3;
    document.getElementById("resultBox").innerHTML = "Wrong";
    document.getElementById("resultBox").style.backgroundColor = "red";
    document.getElementById("totalMarks").innerHTML = "Total Marks: " + marks ;
}




}

</script>
</head>

<body onLoad="getNew()">
    <div class="container">
        <h1>Let's add numbers</h1>
        <div class="sum">
            <input id="num1" type="text" readonly> + <input id="num2" type="text" readonly>
        </div>
        <h2>Enter the answer below and click 'Check'</h2>
        <div class="answer">
            <input id="ans" type="text" value="">
        </div>
        <input id="btnchk" onClick="checkAns()" type="button" value="Check" >
        <div id="resultBox">***</div>
        <input id="btnnew" onClick="getNew()" type="button" value="New">
        <div id="totalMarks">Total marks : 0</div>  
    </div>
</body>
</html>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.