JavaScript で小数点以下を切り捨てる (四捨五入ではない) 質問する

JavaScript で小数点以下を切り捨てる (四捨五入ではない) 質問する

小数を小数点以下で切り捨てようとしています。次のようになります:

5.467   -> 5.46  
985.943 -> 985.94

toFixed(2)ほぼ正しい動作をしますが、値が切り捨てられます。値を切り捨てる必要はありません。JavaScript でこれが可能であることを願っています。

ベストアンサー1

Dogbert の回答は良いですが、コードで負の数を処理する必要がある場合、Math.floorそれだけでは予期しない結果が生じる可能性があります。

例えばMath.floor(4.3) = 4、しかしMath.floor(-4.3) = -5

一貫した結果を得るには、代わりに次のようなヘルパー関数を使用します。

truncateDecimals = function (number) {
    return Math[number < 0 ? 'ceil' : 'floor'](number);
};

// Applied to Dogbert's answer:
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100; // = 5.46

この関数のより便利なバージョンを次に示します。

truncateDecimals = function (number, digits) {
    var multiplier = Math.pow(10, digits),
        adjustedNum = number * multiplier,
        truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);

    return truncatedNum / multiplier;
};

// Usage:
var a = 5.467;
var truncated = truncateDecimals(a, 2); // = 5.46

// Negative digits:
var b = 4235.24;
var truncated = truncateDecimals(b, -2); // = 4200

Math.absこれが望ましい動作でない場合は、最初の行に呼び出しを挿入します。

var multiplier = Math.pow(10, Math.abs(digits)),

編集:a = 17.56shendzは、このソリューションを で使用すると、が誤って生成されることを正しく指摘しています17.55。これが発生する理由の詳細については、以下をお読みください。浮動小数点演算についてコンピュータ科学者が知っておくべきこと残念ながら、浮動小数点エラーの原因をすべて排除するソリューションを JavaScript で記述するのは非常に困難です。他の言語では整数または Decimal 型を使用しますが、JavaScript では...

この解決策すべきである100% 正確ですが、速度も遅くなります。

function truncateDecimals (num, digits) {
    var numS = num.toString(),
        decPos = numS.indexOf('.'),
        substrLength = decPos == -1 ? numS.length : 1 + decPos + digits,
        trimmedResult = numS.substr(0, substrLength),
        finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;

    return parseFloat(finalResult);
}

スピードが必要で浮動小数点エラーを避けたい人は、次のようなものを試してみてください。BigDecimal.js他の JavaScript BigDecimal ライブラリについては、次の SO の質問を参照してください。「良い Javascript BigDecimal ライブラリはありますか?」そしてここに良いブログ記事がありますJavascript の数学ライブラリ

おすすめ記事