Truncate number to two decimal places without rounding

前端 未结 30 2718
再見小時候
再見小時候 2020-11-22 09:08

Suppose I have a value of 15.7784514, I want to display it 15.77 with no rounding.

var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+\"
相关标签:
30条回答
  • 2020-11-22 09:44

    Just truncate the digits:

    function truncDigits(inputNumber, digits) {
      const fact = 10 ** digits;
      return Math.floor(inputNumber * fact) / fact;
    }
    
    0 讨论(0)
  • 2020-11-22 09:44

    Gumbo's second solution, with the regular expression, does work but is slow because of the regular expression. Gumbo's first solution fails in certain situations due to imprecision in floating points numbers. See the JSFiddle for a demonstration and a benchmark. The second solution takes about 1636 nanoseconds per call on my current system, Intel Core i5-2500 CPU at 3.30 GHz.

    The solution I've written involves adding a small compensation to take care of floating point imprecision. It is basically instantaneous, i.e. on the order of nanoseconds. I clocked 2 nanoseconds per call but the JavaScript timers are not very precise or granular. Here is the JS Fiddle and the code.

    function toFixedWithoutRounding (value, precision)
    {
        var factorError = Math.pow(10, 14);
        var factorTruncate = Math.pow(10, 14 - precision);
        var factorDecimal = Math.pow(10, precision);
        return Math.floor(Math.floor(value * factorError + 1) / factorTruncate) / factorDecimal;
    }
    
    var values = [1.1299999999, 1.13, 1.139999999, 1.14, 1.14000000001, 1.13 * 100];
    
    for (var i = 0; i < values.length; i++)
    {
        var value = values[i];
        console.log(value + " --> " + toFixedWithoutRounding(value, 2));
    }
    
    for (var i = 0; i < values.length; i++)
    {
        var value = values[i];
        console.log(value + " --> " + toFixedWithoutRounding(value, 4));
    }
    
    console.log("type of result is " + typeof toFixedWithoutRounding(1.13 * 100 / 100, 2));
    
    // Benchmark
    var value = 1.13 * 100;
    var startTime = new Date();
    var numRun = 1000000;
    var nanosecondsPerMilliseconds = 1000000;
    
    for (var run = 0; run < numRun; run++)
        toFixedWithoutRounding(value, 2);
    
    var endTime = new Date();
    var timeDiffNs = nanosecondsPerMilliseconds * (endTime - startTime);
    var timePerCallNs = timeDiffNs / numRun;
    console.log("Time per call (nanoseconds): " + timePerCallNs);
    
    0 讨论(0)
  • 2020-11-22 09:44

    Already there are some suitable answer with regular expression and arithmetic calculation, you can also try this

    function myFunction() {
        var str = 12.234556; 
        str = str.toString().split('.');
        var res = str[1].slice(0, 2);
        document.getElementById("demo").innerHTML = str[0]+'.'+res;
    }
    
    // output: 12.23
    
    0 讨论(0)
  • 2020-11-22 09:45

    Convert the number into a string, match the number up to the second decimal place:

    function calc(theform) {
        var num = theform.original.value, rounded = theform.rounded
        var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]
        rounded.value = with2Decimals
    }
    <form onsubmit="return calc(this)">
    Original number: <input name="original" type="text" onkeyup="calc(form)" onchange="calc(form)" />
    <br />"Rounded" number: <input name="rounded" type="text" placeholder="readonly" readonly>
    </form>

    The toFixed method fails in some cases unlike toString, so be very careful with it.

    0 讨论(0)
  • 2020-11-22 09:45

    I opted to write this instead to manually remove the remainder with strings so I don't have to deal with the math issues that come with numbers:

    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf("."))+3); //With 3 exposing the hundredths place
    Number(num); //If you need it back as a Number
    

    This will give you "15.77" with num = 15.7784514;

    0 讨论(0)
  • 2020-11-22 09:46

    This worked well for me. I hope it will fix your issues too.

    function toFixedNumber(number) {
        const spitedValues = String(number.toLocaleString()).split('.');
        let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
        decimalValue = decimalValue.concat('00').substr(0,2);
    
        return '$'+spitedValues[0] + '.' + decimalValue;
    }
    
    // 5.56789      ---->  $5.56
    // 0.342        ---->  $0.34
    // -10.3484534  ---->  $-10.34 
    // 600          ---->  $600.00
    

    function convertNumber(){
      var result = toFixedNumber(document.getElementById("valueText").value);
      document.getElementById("resultText").value = result;
    }
    
    
    function toFixedNumber(number) {
            const spitedValues = String(number.toLocaleString()).split('.');
            let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
            decimalValue = decimalValue.concat('00').substr(0,2);
    
            return '$'+spitedValues[0] + '.' + decimalValue;
    }
    <div>
      <input type="text" id="valueText" placeholder="Input value here..">
      <br>
      <button onclick="convertNumber()" >Convert</button>
      <br><hr>
      <input type="text" id="resultText" placeholder="result" readonly="true">
    </div>

    0 讨论(0)
提交回复
热议问题