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


124

我是JavaScript的新手,刚刚发现它toFixed()并取toPrecision()整数字。但是,我无法弄清楚两者之间的区别。

number.toFixed()和之间有什么区别number.toPrecision()

Answers:


133

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

参考在W3School:toFixedtoPrecision

编辑
不久之前,我了解到w3schools并不是最好的资源,但是直到我看到kzh的,“热情的”评论时,我才忘记了这个答案。下面是从Mozilla的文档中心额外裁判toFixed()toPrecision()。对我们所有人来说幸运的是,在这种情况下,MDC和w3schools相互同意。

为了完整起见,我应该提一下,toFixed()它等同于toFixed(0)并且toPrecision()仅返回原始数字而没有格式。


11
Bah,我在2010年7月发布了此信息,直到今年我才了解w3fools。愚人在某些事情上是正确的,但并不是学校里的一切都是错误的。感谢您指出我需要更新这篇文章;会做一点。
流行

24
toPrecision(x)不“提供x总长度”,而是格式化为许多给定的有效数字。例如,0.0000022.toPrecision(1)将返回0.000002
安迪E

5
我刚刚访问了w3fools,但并没有被说服。我什至看不到任何争论。我所看到的只是另外两个网站的广告。
NiCk Newman'3

2
语句“ ... toPrecision(x)提供了x总长度”。不一定成立。反例:0.00001234.toPrecision(3)
djvg

59

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

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

此外,如果数字中的整数位数超过指定的精度,toPrecision将产生科学计数法

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

编辑:哦,如果您不熟悉JavaScript,我强烈推荐Douglas Crockford 撰写的书“ JavaScript:The Good Parts ”。


14

示例清楚地表明:

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

11

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

假设您有以下数据:

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

这将产生您所期望的。没有猜测工作,也没有四舍五入。



5

在某些情况下,toPrecision()将返回指数符号,而toFixed()不会。


其实toExponential()是一个单独的功能
流行

4
@Lord Torgamus:根据我的Java语言:The Definitive Guide的副本,如果精度 arg足以包含数字整数部分的所有数字,则toPrecision(precision)将使用定点表示法。否则,将使用指数符号。
Robusto

至少在某些情况下,这是不正确的:在我的Firefox中,带有a = 999999999999999934464;a.toFixed(0)返回"1e+21"。也许更准确的答案是,除非toString()这样做,否则toFi​​xed()不会返回指数符号。
保罗

1

例如,我们将变量a视为,var a = 123.45 a.toPrecision(6)输出为123.450 a.toFixed(6)输出类似于123.450000 //小数点后6位


0

双方toPrecision()toFixed()都设计打印出来之前格式的数字功能。因此它们都返回String值。

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

toPrecision()返回以String四舍五入到有效数字的定点或指数表示形式的Number对象。因此,如果您指定精度为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以定点符号表示的Number对象,将其向上舍入。此功能仅关心小数点后的数字

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)

请参阅:+0和-0是否相同?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.