Accurately Controlling Numerical Rounding (Round, Floor, Ceil) in JavaScript

目次

Overview

Rounding decimals to integers is a common task in numerical calculations. The JavaScript Math object provides four methods to handle rounding according to specific business rules, such as rounding up or rounding towards zero. This article clarifies the differences between these methods and explains how to control results for both positive and negative numbers.

Specifications (Input/Output)

  • Input: Any floating-point number (positive or negative).
  • Output:
    • Calculation results from each method (round, floor, ceil, trunc).
    • Visual display of results on the page and in the console.

Basic Usage

The behavior of each rounding method is as follows:

MethodMeaningDescriptionResult (3.5)Result (-3.5)
Math.round()RoundRounds to the nearest integer (.5 rounds toward positive infinity).4-3
Math.floor()Round DownReturns the largest integer less than or equal to the value.3-4
Math.ceil()Round UpReturns the smallest integer greater than or equal to the value.4-3
Math.trunc()TruncateSimply removes the decimal part (rounds toward 0).3-3

Full Code (HTML / JavaScript)

HTML (index.html)

This layout uses a table to visually compare the calculation results.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Comparison of Rounding Methods</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        table { border-collapse: collapse; width: 100%; max-width: 800px; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 12px; text-align: center; }
        th { background-color: #f4f4f4; }
        .negative { color: #d32f2f; font-weight: bold; }
    </style>
    <script src="math-rounding.js" defer></script>
</head>
<body>
    <div class="container">
        <h1>Numerical Rounding Results</h1>
        <table>
            <thead>
                <tr>
                    <th>Input Value</th>
                    <th>round</th>
                    <th>floor</th>
                    <th>ceil</th>
                    <th>trunc</th>
                </tr>
            </thead>
            <tbody id="calc-results">
            </tbody>
        </table>
    </div>
</body>
</html>

JavaScript (math-rounding.js)

This script tests various numbers, such as shipping weights or temperature data, to demonstrate different characteristics.

/**
 * Processes a number with four rounding methods and adds a row to the table.
 * @param {number} value - The number to process.
 */
const addResultRow = (value) => {
    // Execute calculations
    const rounded = Math.round(value);
    const floored = Math.floor(value);
    const ceiled  = Math.ceil(value);
    const trunced = Math.trunc(value);

    // Apply a class for negative numbers for better visibility
    const valueClass = value < 0 ? 'negative' : '';

    // Generate HTML for the table row
    const rowHtml = `
        <tr class="${valueClass}">
            <td>${value}</td>
            <td>${rounded}</td>
            <td>${floored}</td>
            <td>${ceiled}</td>
            <td>${trunced}</td>
        </tr>
    `;

    // Reflect results in the DOM
    const tableBody = document.querySelector("#calc-results");
    if (tableBody) {
        tableBody.insertAdjacentHTML('beforeend', rowHtml);
    }
    
    // Log values to the console
    console.log(`Input: ${value} -> R:${rounded}, F:${floored}, C:${ceiled}, T:${trunced}`);
};

// 1. Positive number (decimal < 0.5)
// Example: Product weight 12.3kg
addResultRow(12.34);

// 2. Positive number (decimal >= 0.5)
// Example: Temperature 25.8 degrees
addResultRow(25.8);

// 3. Negative number (decimal closer to 0 than -0.5)
// Example: Coordinate adjustment -5.2
addResultRow(-5.2);

// 4. Negative number (decimal further than -0.5)
// Example: Discount calculation -99.9
// Note the difference between floor and trunc here
addResultRow(-99.9);

// 5. Boundary values (exactly 0.5)
// Verify Math.round behavior (rounds toward positive infinity)
addResultRow(1.5);
addResultRow(-1.5);

Customization Points

  • Specifying Decimal Places: Methods like Math.round only round to integers. To round to the first decimal place, use a formula like Math.round(value * 10) / 10. It is helpful to create a helper function that multiplies and divides by powers of 10.
  • Display Formatting: If the goal is to show values to a user rather than perform calculations, using the toFixed(digits) method or the Intl.NumberFormat API may be more appropriate.

Important Points

Pay close attention to how Math.floor() handles negative numbers. It rounds towards the “smaller” value, meaning -5.8 becomes -6 instead of -5. If you want to perform a simple “truncate” (keep only the integer part), use Math.trunc(), which was added in ES6. Additionally, remember that Math.round() rounds -1.5 to -1 because it rounds toward positive infinity. This can differ from standard rounding rules in some industries.

Advanced Usage

Helper Function for Specific Decimal Places

This is a common function used for financial calculations to round to a specific digit.

/**
 * Rounds a number to a specific number of decimal places.
 * @param {number} val - The value to round.
 * @param {number} precision - The number of decimal places to keep.
 * @returns {number} The rounded value.
 */
const roundAt = (val, precision) => {
    const digit = Math.pow(10, precision);
    return Math.round(val * digit) / digit;
};

console.log(roundAt(1.2345, 2)); // 1.23
console.log(roundAt(1.2355, 2)); // 1.24

The logic follows this formula:

$$\text{Result} = \frac{\text{Math.round}(val \times 10^n)}{10^n}$$

Summary

When handling numerical rounding, you must choose a method based on how it behaves with both positive and negative numbers. Use Math.round for standard rounding, Math.ceil for cases like calculating page numbers in pagination, and Math.trunc for coordinate systems or situations where you must round toward zero. This approach prevents calculation errors and logic inconsistencies.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次