在 javascript 中截断(不四舍五入)十进制数

Truncate (not round off) decimal numbers in javascript

提问人:kcssm 提问时间:2/6/2011 最后编辑:Rudi Visserkcssm 更新时间:12/7/2022 访问量:201686

问:

我正在尝试将十进制数截断到小数位。像这样的东西:

5.467   -> 5.46  
985.943 -> 985.94

toFixed(2)做了几乎正确的事情,但它使价值四舍五入。我不需要四舍五入的值。希望在javascript中这是可能的。

javascript 点浮 点精度

评论

7赞 Felix Kling 2/6/2011
jQuery只是一个框架,您的问题与jQuery无关。它更多的是关于在 JavaScript 中进行一些基本的计算。我希望您也对非jQuery解决方案感到满意。
0赞 MsTapp 11/1/2016
我发现使用 Javascript 让我的计算只返回 2 位小数太费劲了。相反,我能够在我的数据库视图中轻松完成。我意识到这种方法并不适合所有情况,但我想把它放在这里,因为它可能会为某人节省大量时间。

答:

41赞 Dogbert 2/6/2011 #1
var a = 5.467;
var truncated = Math.floor(a * 100) / 100; // = 5.46

评论

5赞 Nick Knowlson 2/11/2012
这很有效,但如果他(或稍后查看此答案的其他人)必须处理负数,则会产生可能不受欢迎的结果。查看 stackoverflow.com/a/9232092/224354
3赞 Thomas W 6/14/2012
为什么不受欢迎?当您低于 0 时改变舍入方向,会导致各种算术伪影。
9赞 Nick Knowlson 8/14/2013
舍入和截断是有区别的。截断显然是这个问题所寻求的行为。如果我打电话回来,我肯定会说这是不可取的。truncate(-3.14)-4
0赞 6/10/2015
我同意托马斯的观点。透视的差异可能伴随着您通常是为了显示还是为了计算而截断。从计算的角度来看,这避免了“算术伪影”
3赞 Sanyam Jain 12/28/2017
var a = 65.1 var truncated = Math.floor(a * 100) / 100; // = 65.09因此,这不是一个正确的解决方案
21赞 RichardTheKiwi 2/6/2011 #2

您可以通过减去 toFixed 的 0.5 来修复舍入,例如

(f - 0.005).toFixed(2)

评论

1赞 Nick Knowlson 10/24/2013
注意:这不适用于非常小的数字、小数点后 3 位以上的数字或负数。尝试 .0045、5.4678 和 -5.467
0赞 dmarra 4/3/2018
只要您将要减去的值与您希望拥有的长度相匹配,这将起作用。无论你传递给 toFixed() 什么,都需要是小数点后 0 的数字。
60赞 kirilloid 2/6/2011 #3

更新:

所以,毕竟事实证明,无论你多么努力地补偿它们,四舍五入的错误总是会困扰你。因此,应该通过精确地用十进制表示法来解决这个问题。

Number.prototype.toFixedDown = function(digits) {
    var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"),
        m = this.toString().match(re);
    return m ? parseFloat(m[1]) : this.valueOf();
};

[   5.467.toFixedDown(2),
    985.943.toFixedDown(2),
    17.56.toFixedDown(2),
    (0).toFixedDown(1),
    1.11.toFixedDown(1) + 22];

// [5.46, 985.94, 17.56, 0, 23.1]

基于他人编译的容易出错的旧解决方案:

Number.prototype.toFixedDown = function(digits) {
  var n = this - Math.pow(10, -digits)/2;
  n += n / Math.pow(2, 53); // added 1360765523: 17.56.toFixedDown(2) === "17.56"
  return n.toFixed(digits);
}

评论

4赞 Thomas W 6/14/2012
是的,原型不能跨浏览器可靠地工作。与其通过类型系统定义这个(有限用途的)函数,以一种不可靠的方式工作,为什么不把它放在库中呢?
3赞 shendz 2/13/2013
这不起作用。尝试数字 17.56 和数字 = 2。它应该是 17.56,但此函数返回 17.55。
2赞 Nick Knowlson 3/12/2014
此函数有两个不一致之处:此函数返回一个字符串,因此最终为 而不是 。也应该生产,但它却生产.1.11.toFixedDown(1) + 221.12223.10.toFixedDown(1)0-0.1
5赞 rgajrawala 7/16/2014
请注意,此函数删除了负号。前任:。(-10.2131).toFixedDown(2) // ==> 10.21
4赞 rgajrawala 7/16/2014
也。这样做是为了(例如:、、...)。(1e-7).toFixedDown(0) // ==> 1e-71e-(>=7)1e-81e-9
78赞 Nick Knowlson 2/11/2012 #4

Dogbert 的回答很好,但是如果你的代码可能必须处理负数,那么它本身可能会产生意想不到的结果。Math.floor

例如,但是Math.floor(4.3) = 4Math.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)),

编辑:shendz 正确地指出,使用此解决方案将错误地产生 .有关发生这种情况的原因的更多信息,请阅读每个计算机科学家都应该了解的浮点运算知识。不幸的是,编写一个消除所有浮点错误来源的解决方案对于 javascript 来说非常棘手。在另一种语言中,你会使用整数或十进制类型,但使用 javascript......a = 17.5617.55

此解决方案应该是 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这样的东西。你可以在这个 SO 问题中找到其他 javascript BigDecimal 库:“有没有一个好的 Javascript BigDecimal 库?”,这里有一篇关于 Javascript 数学库的好博客文章

评论

0赞 Thomas W 6/14/2012
为什么出乎意料?当你低于 0 时改变四舍五入的方向,会导致各种算术伪影和蹩脚的数学。例如,四舍五入为 0 的数字是任何其他整数的两倍。对于图形、会计和许多其他用途,你会得到糟糕的结果。说实话,说你的建议有什么好处比说什么不好更难。
0赞 Nick Knowlson 6/14/2012
它对它所说的是有好处的 - 当你想截断小数而不是四舍五入时。
1赞 shendz 2/13/2013
不适用于 17.56,因为浏览器给出 17.56 * 100 = 1755.99999999999998 而不是 1756
0赞 Nick Knowlson 3/2/2013
好点申兹。我已经更新了我的答案,为那些需要它的人消除了所有浮点错误。
1赞 Jeremy Witmer 4/23/2013
如果您不需要小数,这将不适用于小于 1 的数字 - truncateDecimals(.12345, 0) 会导致 NaN,除非您添加检查: 取决于您想要的行为。if(isNAN(result) result = 0;
2赞 opensas 5/15/2013 #5

以下是我对这个问题的看法:

convert.truncate = function(value, decimals) {
  decimals = (decimals === undefined ? 0 : decimals);
  return parseFloat((value-(0.5/Math.pow(10, decimals))).toFixed(decimals),10);
};

这只是一个稍微更复杂的版本

(f - 0.005).toFixed(2)
19赞 ruffin 5/23/2013 #6

考虑利用双波浪号:~~

接受这个数字。乘以小数点后的实际数字,以便可以使用 截到零位。将乘数除以外。利润。~~

function truncator(numToTruncate, intDecimalPlaces) {    
    var numPower = Math.pow(10, intDecimalPlaces); // "numPowerConverter" might be better
    return ~~(numToTruncate * numPower)/numPower;
}

我试图抵制用 parens 包装电话;我相信,操作顺序应该使它正常工作。~~

alert(truncator(5.1231231, 1)); // is 5.1

alert(truncator(-5.73, 1)); // is -5.7

alert(truncator(-5.73, 0)); // is -5

JSFiddle 链接

编辑:回想起来,我无意中也处理了小数点左边四舍五入的情况。

alert(truncator(4343.123, -2)); // gives 4300.

寻找这种用法的逻辑有点古怪,并且可能会从快速重构中受益。但它仍然有效。好运总比好。

评论

0赞 Liglo App 12/3/2014
这是最好的答案。如果你用它来扩展原型,并在执行之前检查NaN-s,那将是完美的。Math
0赞 Alex 6/30/2019
truncator((10 * 2.9) / 100, 2)返回 0.28 而不是 0.29 ...jsfiddle.net/25tgrzq1
0赞 HelpfulPanda 12/15/2020
对我不起作用,truncator(1000.12345678, 7) 返回 141.1299975
0赞 ruffin 12/16/2020
@Alex 如果要避免浮点错误,请使用十进制类型。或者我想我们可以重写以使用字符串操作,但这似乎很疯狂。您会注意到类似的答案也有同样的问题。
0赞 ruffin 12/16/2020
@HelpfulPanda这是因为 JavaScript 使用 32 位整数作为按位运算符最大 32 位 int 为 2,147,483,647,明显大于 。如果你真的有大于 32 位的数字(相反,如果你需要那么多有效数字),这不是你要找的机器人。这是一个快速而肮脏(且快速)的答案,例如,4-5 个 sig 数字。对于可能矫枉过正的完美,请尝试公认的答案。;^D1000123456782147483647
0赞 Sergio Campamá 6/8/2013 #7

只是为了指出一个对我有用的简单解决方案

将其转换为字符串,然后对其进行正则表达式...

var number = 123.45678;
var number_s = '' + number;
var number_truncated_s = number_s.match(/\d*\.\d{4}/)[0]
var number_truncated = parseFloat(number_truncated_s)

它可以缩写为

var number_truncated = parseFloat(('' + 123.4568908).match(/\d*\.\d{4}/)[0])
11赞 Daniel X Moore 3/18/2014 #8

我以为我会用一个答案,因为它很简单而且效果很好。|

truncate = function(number, places) {
  var shift = Math.pow(10, places);

  return ((number * shift) | 0) / shift;
};

评论

1赞 ruffin 6/13/2015
好电话。使用按位运算符将值强制转换为 int,而 0 表示“保留我已经拥有的东西”。做我的答案,但只有一个按位运算。虽然它也有和写的一样的限制:我们不能超过 2^31or~~
1赞 Alex 6/30/2019
当此代码返回 0.28 而不是 0.29 时不正确 jsfiddle.net/9pf0732dtruncate((10 * 2.9) / 100);
0赞 ruffin 7/1/2019
@Alex 正如我猜你意识到的那样......欢迎来到 JavaScript!。有修复。也许你想分享一个?:D
0赞 Alex 7/1/2019
@ruffin我知道这个问题=)我认为这个答案是这个问题的解决方案。不幸的是,我还没有找到确切的解决方案,到处都是这样的问题。
1赞 Sebastián Rojas 4/24/2014 #9

标记为解决方案的那个是我直到今天才找到的更好的解决方案,但 0 存在严重问题(例如,0.toFixedDown(2) 给出 -0.01)。所以我建议使用这个:

Number.prototype.toFixedDown = function(digits) {
  if(this == 0) {
    return 0;
  }
  var n = this - Math.pow(10, -digits)/2;
  n += n / Math.pow(2, 53); // added 1360765523: 17.56.toFixedDown(2) === "17.56"
  return n.toFixed(digits);
}
1赞 Steve 7/17/2014 #10

这是我使用的:

var t = 1;
for (var i = 0; i < decimalPrecision; i++)
    t = t * 10;

var f = parseFloat(value);
return (Math.floor(f * t)) / t;
2赞 RohannG 7/22/2014 #11

这是一个简单但有效的功能,可以将数字截断到小数点后 2 位。

           function truncateNumber(num) {
                var num1 = "";
                var num2 = "";
                var num1 = num.split('.')[0];
                num2 = num.split('.')[1];
                var decimalNum = num2.substring(0, 2);
                var strNum = num1 +"."+ decimalNum;
                var finalNum = parseFloat(strNum);
                return finalNum;
            }
4赞 Max Zlotskiy 11/24/2014 #12
Number.prototype.trim = function(decimals) {
    var s = this.toString();
    var d = s.split(".");
    d[1] = d[1].substring(0, decimals);
    return parseFloat(d.join("."));
}

console.log((5.676).trim(2)); //logs 5.67

评论

0赞 iCode 7/29/2020
我喜欢这适用于字符串,从而消除了浮点数的细微差别。谢谢!
0赞 HelpfulPanda 12/15/2020
控制台.log((-5).trim(2));抛出未捕获的 TypeError:d[1] 未定义
3赞 juanpscotto 3/27/2015 #13

我发现了一个问题:考虑下一个情况:2.1或1.2或-6.4

如果你总是想要 3 位小数或两位小数,或者永远如此,所以,你必须完成右边的前导零怎么办

// 3 decimals numbers
0.5 => 0.500

// 6 decimals
0.1 => 0.10000

// 4 decimales
-2.1 => -2.1000

// truncate to 3 decimals
3.11568 => 3.115

这是 Nick Knowlson 的固定功能

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

    // adds leading zeros to the right
    if (decPos != -1){
        var s = trimmedResult+"";
        decPos = s.indexOf('.');
        var decLength = s.length - decPos;

            while (decLength <= digits){
                s = s + "0";
                decPos = s.indexOf('.');
                decLength = s.length - decPos;
                substrLength = decPos == -1 ? s.length : 1 + decPos + digits;
            };
        finalResult = s;
    }
    return finalResult;
};

https://jsfiddle.net/huttn155/7/

评论

0赞 Ling Loeng 11/15/2018
x = 0.0000测试失败。返回。不如预期truncateDecimals (x, 2)00.00
2赞 Bob Lyon 4/26/2015 #14

生成的类型仍然是一个数字...

/* Return the truncation of n wrt base */
var trunc = function(n, base) {
    n = (n / base) | 0;
    return base * n;
};
var t = trunc(5.467, 0.01);
21赞 MeestorHok 3/13/2016 #15

不错的单线解决方案:

function truncate (num, places) {
  return Math.trunc(num * Math.pow(10, places)) / Math.pow(10, places);
}

然后用以下命令调用它:

truncate(3.5636232, 2); // returns 3.56
truncate(5.4332312, 3); // returns 5.433
truncate(25.463214, 4); // returns 25.4632

评论

2赞 Gene Parcellano 1/20/2017
我喜欢这个解决方案,但请记住,并非所有浏览器都完全支持它。(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...)
0赞 HelpfulPanda 12/15/2020
如果这 100% 有效,会很高兴,但是 Math.trunc(0.29 * Math.pow(10, 2)) / Math.pow(10, 2) 给你 0.28。老实说,到目前为止,我见过的唯一可靠方法是拆分/切割字符串。
0赞 stackoverflow 3/21/2022
@HelpfulPanda PFF 是,WTF :|我目前很难解决这个问题,所以我想我会回退,因为你建议字符串:)
0赞 Cristian Sima 8/31/2016 #16

这是一个 ES6 代码,它可以做你想要的

const truncateTo = (unRouned, nrOfDecimals = 2) => {
      const parts = String(unRouned).split(".");

      if (parts.length !== 2) {
          // without any decimal part
        return unRouned;
      }

      const newDecimals = parts[1].slice(0, nrOfDecimals),
        newString = `${parts[0]}.${newDecimals}`;

      return Number(newString);
    };

// your examples 

 console.log(truncateTo(5.467)); // ---> 5.46

 console.log(truncateTo(985.943)); // ---> 985.94

// other examples 

 console.log(truncateTo(5)); // ---> 5

 console.log(truncateTo(-5)); // ---> -5

 console.log(truncateTo(-985.943)); // ---> -985.94

9赞 John Strickler 11/28/2016 #17

使用按位运算符截断:

~~0.5 === 0
~~(-0.5) === 0
~~14.32794823 === 14
~~(-439.93) === -439

评论

0赞 jperelli 5/12/2017
这是如何工作的参考:stackoverflow.com/questions/7487977/...
0赞 Salman A 1/20/2018
它如何将某些内容截断到小数点后 2 位?
-1赞 Dercni 1/3/2017 #18
Number.prototype.truncate = function(places) {
  var shift = Math.pow(10, places);

  return Math.trunc(this * shift) / shift;
};
9赞 zurfyx 1/15/2017 #19

@Dogbert 的答案可以用 Math.trunc 来改进,它会截断而不是四舍五入。

舍入和截断是有区别的。截断是 显然,这个问题正在寻求的行为。如果我打电话给 截断(-3.14) 并接收 -4,我肯定会这样称呼它 不良。– @NickKnowlson

var a = 5.467;
var truncated = Math.trunc(a * 100) / 100; // = 5.46
var a = -5.467;
var truncated = Math.trunc(a * 100) / 100; // = -5.46

评论

1赞 Mike Makuch 4/3/2018
这并非在所有情况下都有效,即 console.log(Math.trunc(9.28 * 100) / 100);9.27
1赞 zurfyx 4/3/2018
@MikeMakuch这不是 的问题,而是 而不是 而不是 。你可能想读一读《浮点的危险》Math.trunc9.28 * 100927.9999928
3赞 ProgWiz 10/3/2017 #20

@kirilloid的答案似乎是正确的答案,但是,主代码需要更新。他的解决方案不处理负数(有人在评论部分提到了负数,但尚未在主代码中更新)。

将其更新为完整的最终测试解决方案:

Number.prototype.toFixedDown = function(digits) {
    var re = new RegExp("([-]*\\d+\\.\\d{" + digits + "})(\\d)"),
    m = this.toString().match(re);
    return m ? parseFloat(m[1]) : this.valueOf();
};

示例用法:

var x = 3.1415629;
Logger.log(x.toFixedDown(2)); //or use whatever you use to log

小提琴:JS 数字向下舍入

PS:没有足够的 repo 来评论该解决方案。

3赞 Flavio 3/14/2018 #21
function toFixed(number, digits) {
    var reg_ex = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)")
    var array = number.toString().match(reg_ex);
    return array ? parseFloat(array[1]) : number.valueOf()
}

var test = 10.123456789
var __fixed = toFixed(test, 6)
console.log(__fixed)
// => 10.123456
6赞 Julio Cesar Cervantes Martinez 4/17/2018 #22

我认为这个功能可能是一个简单的解决方案:

function trunc(decimal,n=2){
  let x = decimal + ''; // string 
  return x.lastIndexOf('.')>=0?parseFloat(x.substr(0,x.lastIndexOf('.')+(n+1))):decimal; // You can use indexOf() instead of lastIndexOf()
}

console.log(trunc(-241.31234,2));
console.log(trunc(241.312,5));
console.log(trunc(-241.233));
console.log(trunc(241.2,0));  
console.log(trunc(241));

评论

0赞 giles123 7/19/2018
发布两年后,当我尝试使用 Math.trunc、regex 等找出最佳方法时,偶然发现了这一点。我真的很喜欢这个解决方案。非常简单,但效果很好(无论如何对于我的用例)。
0赞 giles123 7/19/2018
不过,不要忘记考虑 n=0。
2赞 Matthias 7/26/2018 #23

Lodash 有一些 Math 实用程序方法,可以将数字四舍五入、下限入到给定的十进制精度。这将留下尾随零。

他们采用一种有趣的方法,使用数字的指数。显然,这避免了舍入问题。

(注意:在下面的代码中是或或)funcMath.roundceilfloor

// Shift with exponential notation to avoid floating-point issues.
var pair = (toString(number) + 'e').split('e'),
    value = func(pair[0] + 'e' + (+pair[1] + precision));

pair = (toString(value) + 'e').split('e');
return +(pair[0] + 'e' + (+pair[1] - precision));

链接到源代码

7赞 user8249395 7/20/2019 #24

我用一种较短的方法写了一个答案。这是我想出的

function truncate(value, precision) {
    var step = Math.pow(10, precision || 0);
    var temp = Math.trunc(step * value);

    return temp / step;
}

该方法可以像这样使用

truncate(132456.25456789, 5)); // Output: 132456.25456
truncate(132456.25456789, 3)); // Output: 132456.254
truncate(132456.25456789, 1)); // Output: 132456.2   
truncate(132456.25456789));    // Output: 132456

或者,如果你想要一个更短的语法,你可以去吧

function truncate(v, p) {
    var s = Math.pow(10, p || 0);
    return Math.trunc(s * v) / s;
}

评论

0赞 taxilian 9/27/2020
这是我期望使用的方法
0赞 HelpfulPanda 12/15/2020
与其他人指出的相同问题,truncate(0.29, 2) 为您提供 0.28。
2赞 givanse 12/27/2019 #25
const TO_FIXED_MAX = 100;

function truncate(number, decimalsPrecison) {
  // make it a string with precision 1e-100
  number = number.toFixed(TO_FIXED_MAX);

  // chop off uneccessary digits
  const dotIndex = number.indexOf('.');
  number = number.substring(0, dotIndex + decimalsPrecison + 1);

  // back to a number data type (app specific)
  return Number.parseFloat(number);
}

// example
truncate(0.00000001999, 8);
0.00000001

适用于:

  • 负数
  • 非常小的数字(Number.EPSILON 精度)
1赞 Daniel Alejandro Lima Monzon 1/11/2020 #26

您可以使用字符串。 它检查“.”是否存在,然后删除部分字符串。

截断 (7.88, 1) --> 7.8

截断 (7.889, 2) --> 7.89

截断 (-7.88, 1 ) --> -7.88

function  truncate(number, decimals) {
    const tmp = number + '';
    if (tmp.indexOf('.') > -1) {
        return +tmp.substr(0 , tmp.indexOf('.') + decimals+1 );
    } else {
        return +number
    }
 }
4赞 taxilian 9/27/2020 #27

我有点困惑,为什么这样一个基本简单的问题有这么多不同的答案;我只看到两种方法值得一看。我做了一个快速基准测试,看看使用 https://jsbench.me/ 的速度差异。

这是目前(2020 年 9 月 26 日)标记为答案的解决方案:

function truncate(n, digits) {
    var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"),
        m = n.toString().match(re);
    return m ? parseFloat(m[1]) : n.valueOf();
};

[   truncate(5.467,2),
    truncate(985.943,2),
    truncate(17.56,2),
    truncate(0, 1),
    truncate(1.11, 1) + 22];

然而,这是在做字符串和正则表达式的东西,这通常不是很有效,并且有一个 Math.trunc 函数,它完全按照 OP 的要求执行,只是没有小数。因此,您可以轻松地使用它加上一些额外的算术来获得同样的东西。

这是我在此线程上找到的另一个解决方案,这是我将使用的解决方案:

function truncate(n, digits) {
    var step = Math.pow(10, digits || 0);
    var temp = Math.trunc(step * n);

    return temp / step;
}

[   truncate(5.467,2),
    truncate(985.943,2),
    truncate(17.56,2),
    truncate(0, 1),
    truncate(1.11, 1) + 22];
    

第一种方法比第二种方法“慢 99.92%”,因此第二种方法绝对是我推荐使用的方法。

好吧,回到寻找其他方法来避免工作......

screenshot of the benchmark

0赞 Mohit Vachhani 3/25/2021 #28

假设您要截断数字 x 直到 n 位数字。

Math.trunc(x * pow(10,n))/pow(10,n);
-3赞 Elias kibret 6/18/2021 #29

let number=5.467; // we want to truncate into 5.46
let result=+number.toString().split("").splice(0,4).join('');
console.log(result);

-2赞 Ankur144 6/22/2021 #30
  function toFix(num,n)
    {
    beforeDecimal=num.toString().split(".",[2])[0];
    afterDecimal=num.toString().split(".",[2])[1];
    updateAfterDecimal="";
    if(afterDecimal != undefined && afterDecimal.length >= n )
        updateAfterDecimal =afterDecimal.slice(0,n);
    if(afterDecimal != undefined && afterDecimal.length < n )
        updateAfterDecimal= afterDecimal.padEnd(n,"0");
    if(afterDecimal== undefined)
        updateAfterDecimal=updateAfterDecimal.padEnd(n,"0");
    console.log(`${beforeDecimal}.${updateAfterDecimal}`);
    }
    toFix(5.12365889,5); 

评论

0赞 Ankur144 6/22/2021
此代码将添加填充“0”是小数点后的位置,而不是所需的位置。
0赞 Ankur144 6/22/2021
例如,代表小数点后 3 位(填充“0”) 5.3 --->5.300 0.01 ---->0.010 0.00001 --->0.000 5.32195--->5.321 -3.66696---> -3.666
1赞 webm94 1/31/2022 #31
function trunc(num, dec) {
  const pow = 10 ** dec
  return Math.trunc(num * pow) / pow
}

// ex.
trunc(4.9634, 1) // 4.9
trunc(4.9634, 2) // 4.96
trunc(-4.9634, 1) // -4.9

评论

0赞 gnzg 7/22/2022
易于阅读且优雅 - 荣誉!
0赞 lycandroid 11/18/2022
不起作用 - .这是因为 -> .trunc(1304.35,2) // 1304.34num * pow1304.35 * 100 // 130434.99999999999
2赞 meisenman 9/25/2022 #32

你可以使用 toFixed(2) 将你的浮点数转换为小数点后 2 位的字符串。然后,您可以将其包装在 floatParse() 中,将该字符串转换回浮点数,使其可用于计算或数据库存储。

const truncatedNumber = floatParse(num.toFixed(2))

我不确定这个答案的潜在缺点,例如增加处理时间,但我测试了其他评论中的边缘情况,例如 .29,它返回 .29(而不是像其他解决方案那样的 .28)。它还处理负数。