toFixed()和toPrecision()之间的区别?

时间:2010-07-26 18:35:42

标签: javascript rounding precision

我是JavaScript新手,刚刚发现了toFixed()toPrecision()来围绕数字。但是,我无法弄清楚两者之间的区别是什么。

number.toFixed()number.toPrecision()之间的区别是什么?

8 个答案:

答案 0 :(得分:120)

toFixed(n)在小数点后面提供n长度; toPrecision(x)提供x总长度。

参考w3schools:toFixedtoPrecision

  

修改
  我回忆起w3schools并不是最好的来源,但我忘记了这个答案,直到我看到kzh,呃,“热情”的评论。以下是来自Mozilla文档中心for toFixed()for toPrecision()的其他参考。幸运的是,对于我们所有人来说,MDC和w3schools在这种情况下都是一致的。

为了完整起见,我应该提到toFixed()相当于toFixed(0)toPrecision()只返回没有格式化的原始数字。

答案 1 :(得分:55)

我相信前者为您提供固定数量的小数位数,而后者则为您提供固定数量的有效位数。

Math.PI.toFixed(2); // "3.14"
Math.PI.toPrecision(2); // "3.1"

此外,如果数字中的整数位数多于指定的精度,toPrecision将产生scientific notation

(Math.PI * 10).toPrecision(2); // "31"
(Math.PI * 100).toPrecision(2); // "3.1e+2"

编辑: 哦,如果你是JavaScript新手,我强烈推荐道格拉斯·克罗克福德的书“JavaScript: The Good Parts”。

答案 2 :(得分:9)

我认为最好用一个例子来回答。

假设您有以下数据:

var products = [
  {
    "title": "Really Nice Pen",
    "price": 150
  },
  {
    "title": "Golf Shirt",
    "price": 49.99
  },
  {
    "title": "My Car",
    "price": 1234.56
  }
]

您希望以标题和格式价格显示每种产品。我们先尝试使用toPrecision

document.write("The price of " + products[0].title + " is $" + products[0].price.toPrecision(5));

The price of Really Nice Pen is $150.00

看起来不错,所以您可能会认为这也适用于其他产品:

document.write("The price of " + products[1].title + " is $" + products[2].price.toPrecision(5));
document.write("The price of " + products[2].title + " is $" + products[2].price.toPrecision(5));

The price of Golf Shirt is $49.990
The price of My Car is $1234.6

不太好。我们可以通过更改每个产品的有效位数来解决这个问题,但是如果我们正在迭代可能很棘手的产品数组。我们改用toFixed

document.write("The price of " + products[0].title + " is $" + products[0].price.toFixed(2));
document.write("The price of " + products[1].title + " is $" + products[2].price.toFixed(2));
document.write("The price of " + products[2].title + " is $" + products[2].price.toFixed(2));

The price of Really Nice Pen is $150.00
The price of Golf Shirt is $49.99
The price of My Car is $1234.56

这产生了你的期望。没有猜测工作,也没有四舍五入。

答案 3 :(得分:6)

只需:

49.99.toFixed(5)
// → "49.99000"

49.99.toPrecision(5)
// → "49.990"

答案 4 :(得分:5)

示例清楚地说明:

var A = 123.456789;

A.toFixed()      // 123
A.toFixed(0)     // 123
A.toFixed(1)     // 123.5
A.toFixed(2)     // 123.46
A.toFixed(3)     // 123.457
A.toFixed(4)     // 123.4568
A.toFixed(5)     // 123.45679
A.toFixed(6)     // 123.456789
A.toFixed(7)     // 123.4567890
A.toFixed(8)     // 123.45678900
A.toFixed(9)     // 123.456789000
A.toFixed(10)    // 123.4567890000
A.toFixed(11)    // 123.45678900000

A.toPrecision()      // 123.456789 
A.toPrecision(0)     // --- ERROR --- 
A.toPrecision(1)     // 1e+2
A.toPrecision(2)     // 1.2e+2
A.toPrecision(3)     // 123
A.toPrecision(4)     // 123.5
A.toPrecision(5)     // 123.46
A.toPrecision(6)     // 123.457
A.toPrecision(7)     // 123.4568
A.toPrecision(8)     // 123.45679
A.toPrecision(9)     // 123.456789
A.toPrecision(10)    // 123.4567890
A.toPrecision(11)    // 123.45678900

答案 5 :(得分:4)

在某些情况下,toPrecision()将返回指数表示法,而toFixed()则不会。

答案 6 :(得分:0)

toPrecision()toFixed()都是用于在打印输出之前格式化数字的功能。因此它们都返回String值。

有一个例外。如果在 Number文字上使用这些功能,由于运算符的优先级,将返回Number。这意味着toFixed()toPrecision()将首先返回一个字符串,然后-减运算符会将字符串转换为Number作为负值。请参见下面的示例。

toPrecision()返回一个String,它以定点或指数表示法四舍五入到有效数字。因此,如果您指定精度为1,则它会返回第一个有效数字以及科学计数法,以表示10的幂,或者如果有效数字为<0,则返回小数点前的0。

const num1 = 123.4567;

// if no arguments are passed, it is similar to converting the Number to String
num1.toPrecision();   // returns "123.4567

// scientific notation is used when you pass precision count less than total
// number of digits left of the period
num1.toPrecision(2);  // returns "1.2e+2"

// last digit is rounded if precision is less than total significant digits
num1.toPrecision(4);  // returns "123.5"
num1.toPrecision(5);  // returns "123.46"

const largeNum = 456.789;
largeNum.toPrecision(2);  // returns "4.6e+2"

// trailing zeroes are added if precision is > total digits of the number or float
num1.toPrecision(9);  // returns "123.456700"

const num2 = 123;
num2.toPrecision(4);  // returns "123.0"

const num3 = 0.00123;
num3.toPrecision(4);  // returns "0.001230"
num3.toPrecision(5);  // returns "0.0012300"

// if the number is < 1, precision is by the significant digits
num3.toPrecision(1);  // returns "0.001"

toFixed()返回一个String,它以定点表示法将数字对象四舍五入。此功能仅关心小数点数字

const num1 = 123.4567;

// if no argument is passed, the fractions are removed
num1.toFixed();  // returns "123"

// specifying an argument means you the amount of numbers after the decimal point
num1.toFixed(1);  // returns "123.5"
num1.toFixed(3);  // returns "123.457"
num1.toFixed(5);  // returns "123.45670"
num1.toFixed(7);  // returns "123.4567000"

// trying to operator on number literals
2.34.toFixed(1);  // returns "2.3"
2.toFixed(1);     // returns SyntaxError
(2).toFixed(1);   // returns "2.0"
(2.34e+5).toFixed(1);  // returns "234000.0"

我上面提到了一个例外,其中由于运算符的优先级,在负数数字文字上使用这些函数将返回数字而不是字符串。以下是一些示例:

// Note: these are returning as Number
// toPrecision()
-123.45.toPrecision();  // returns -123.45
-123.45.toPrecision(2);  // returns -120
-123.45.toPrecision(4);  // returns -123.5
-2.34e+2.toPrecision(1);  // returns -200
-0.0456.toPrecision(1);  // returns -0.05
-0.0456.toPrecision(6);  // returns -0.0456

// toFixed()
-123.45.toFixed();  // returns -123.45
-123.45.toFixed(1);  // returns -123.5
-123.45.toFixed(4);  // returns -123.45
-0.0456.toFixed(1);  // returns -0
-0.0456.toFixed(6);  // -0.0456

有趣的事实:从-0.0456.toFixed(1)看到有零号

请参阅:Are +0 and -0 the same?

答案 7 :(得分:0)

toFixed(fractionDigits?)在其他答案中或多或少地得到了准确的解释:

  • 它返回数字的字符串表示形式,其小数点后有fractionDigits [amount]个数字:

一个例子:

(-3).toFixed(1)     // '-3.0'
(-3).toFixed(0)     // '-3'
(-3).toFixed()      // '-3'
(-0.03).toFixed(1)  // '-0.0'

toPrecision(precision?) 在先前的答案中未正确描述,因此应引起注意。 我还要添加一个免责声明,表明我无法汇总toPrecision上的规范,因此接下来的内容基于测试Node.js中的实现的尝试和错误方法。这些步骤并未涵盖所有极端情况,例如数字为NaN或精度arg不是整数或<1或> 100等的情况。这是为了不使说明混乱,因为规范似乎会。

* 案例列表中保留了案例编号,尽管案例看起来与其他案例相似,但它们仍需要证明特定的行为

  1. 它首先用指数表示法表示数字,其中precision 是有效数字的位数,例如

情况1:0.000004→精度= 3→400 * 10^-8
情况2:0.0000004→精度= 3→400 * 10^-9
情况3:123→精度= 1→1.23 * 10^2
情况4:153→精度= 1→1.53 * 10^2
情况5:1234.56→精度= 3→123.456 * 10^1
情况6:1234.56→精度= 5→12345.6 * 10^-1

  1. 然后将有效位数四舍五入

案例1:400 * 10^-8400 * 10^-8(不存在分数,没有变化)
情况2:400 * 10^-9400 * 10^-9(与情况1相同的推理)
情况3:1.23 * 10^21 * 10^2({{1}被舍入为1.23
情况4:11.53 * 10^22 * 10^2舍入为1.53
情况5:2123.456 * 10^1(也四舍五入)
情况6:123 * 10^112345.6 * 10^-1(四舍五入)

  1. 然后根据规则生成数字的字符串表示形式

3a)将保留步骤2中有效位的所有数字

3b)如果12346 * 10^-1 <点之前的位数(以“正常”表示,即十进制表示形式),则使用指数表示法

情况3:precision1 * 10^2(数字现在为'1e+2',3位数字,精度为1,使用指数)
情况4:1002 * 10^2(数字现在为'2e+2',三位数,精度为1,使用指数)
情况5:200123 * 10^1(数字现在为'1.23e+3',4位数字,精度为3,使用指数; 请注意,有效数字保留了步骤2中的所有数字< / em>:1230变成了123

3c)如果数字的整数部分为0,并且在小数点后第一个有效数字(“正常”表示法)之前为零,则使用指数表示法。

情况2:1.23400 * 10^-9(数字为0.0000004,它具有'4.00e-7'整数部分,小数点后有> 5个零,请注意两个来自 0 的零

3d)使用十进制表示法,如果该数字具有0的整数部分,并且紧接小数点<= 5之后为零,但是将保留步骤2中有效数字的数字

情况1:400 * 10^-9400 * 10^-8(有效部分的两个零已保留)

3e),如果'0.00000400'> =以十进制表示的点之前的位数,则使用十进制表示法

情况6:precision12346 * 10^-1(步骤2中数字的十进制形式为1234.6,精度为5,小数点之前的位数为4,字符串使用十进制表示法,步骤2中所有有效数字的数字都被保留)

1234.6