查看此代码:
function testprecision(){
var isNotNumber = parseFloat('1.3').toPrecision(6);
alert(typeof isNotNumber); //=> string
}
我本来期待一个号码。如果'isNotNumber'应该是一个实数,重铸是解决方案:
alert(typeof parseFloat(isNotNumber)) //=> number
[编辑] 谢谢你的回答。我总结说,精度不是那么精确。它可以表示数字的总位数,或小数位数。荷兰的大多数人(我来自哪里)都会想到“分数位数”的精确度。 javascript toPrecision方法涉及第一个表示,因此这是令人困惑的。无论如何,这种方法可以引入“虚假精度”,对吗?对于第二个含义,我们有固定,同样适用于此(返回字符串,错误精度的可能性)。
无论如何,我重新发明轮子是我的主要爱好,我利用我在这里收集的知识,围绕构建一个javascript浮动对象。也许这对那里的人有用,或者你们中的一个人有更好的想法?
function Float(f,nDec) {
var Base = this,val;
setPrecision( nDec || 2 );
set( f || 0, nDec || Base.precision );
Base.set = set;
Base.ndec = setPrecision;
/** public setprecision
* sets a value for the number of fractional
* digits (decimals) you would like getf to
* return. NB: can't be more than 20.
* Returns the Float object, so allows method
* chaining
* @param {Number} iPrecision
*/
function setPrecision(iPrecision) {
var ix = parseInt(iPrecision,10) || 2;
Base.precision = ix >= 21 ? 20 : ix;
return Base;
}
/** public set
* sets the 'internal' value of the object. Returns
* the Float object, so allows method chaining
* @param {Number} f
* @param {Number} ndec
*/
function set(f,ndec) {
val = parseFloat(f) || 0;
if (ndec) { setPrecision(ndec); }
Base.val = val;
return Base;
}
/** public get:
* return number value (as a float)
*/
Base.get = function(){
var ndec = Math.pow(10,Base.precision),
ival = parseInt(val*ndec,10)/ndec;
Base.val = ival;
return Base.val;
};
/** public getf
* returns formatted string with precision
* (see Base.setPrecision)
* if [hx] is supplied, it returns
* the float as hexadecimal, otherwise
* @param {Boolean} hx
*/
Base.getf = function(hx){
var v = Base.val.toFixed(Base.precision);
return hx ? v.toString(16) : v;
};
/** public add
* adds [f] to the current value (if [f] is a
* Float, otherwise returns current value)
* optionally sets a new number of decimals
* from parameter [ndec]
* @param {Number} f
* @param {Number} ndec
*/
Base.add = function(f,ndec){
if ( parseFloat(f) || val===0) {
set(Base.val+parseFloat(f));
if (ndec) { setPrecision(ndec);}
}
return Base.get();
};
/** toString
* returns the internal value of the Float object
* functions like a getter (supposedly)
*/
Base.toString = Base.get;
}
使用/示例:
var xf = new Float(); //=> value now 0.0
xf.set(0.86/0.8765,17).add(3.459);
alert(xf+'|'+xf.getf()); //=> 4.440175128351398|4.44017512835139800
答案 0 :(得分:10)
从文档:“将表示Number对象的字符串返回到指定的精度。”
toPrecision()似乎用于格式化输出,在这种情况下,字符串是最合理的结果。它代表了一种不会被进一步操纵所破坏的形式的最终输出。
如果你想要计算精度的一些截断,我倾向于乘以10 ^ n,其中n是我想要保留的数字,从中取一个整数然后再用相同的除法。但这并不完美:在某些情况下,您可能会邀请溢出。坦率地说,我更喜欢在服务器上进行更复杂的财务计算,我有货币,二进制编码的十进制或类似的数字类型。
答案 1 :(得分:10)
假设你有一个像'1.6'这样的数字。如果将其格式化为右侧有6个零,则会得到“1.600000”。对于计算机,它仍然是1.6的数字,但对于您和您的网站,如果您的所有数字都具有不同的长度(例如,这可能会伤害解析器),则不一样。
因此,为了避免它,toPrecision返回一个字符串,否则解释器会将数字重新格式化为“1.6”。
答案 2 :(得分:5)
toPrecision
的目的是将Number
的重要十进制数字截断为指定的数量。但Number
s的内部表示的数据类型是二进制 IEEE-754 double。因此,不可能在大多数时间内将{em>精确返回值存储在Number
中。由于这种不精确性,返回值将具有无限量的十进制数字,这将使toPrecision
无效。
因此,解决此问题的唯一合理方法是返回十进制数字。目前,十进制数字唯一合理的JS数据类型是String。
这是一个例子,用于澄清Number
s如果用于十进制数字的不精确性:
// the following looks like something with 2 decimal digits:
var number = 1.6;
// but in fact it's a number with an infinite amount of decimal digits.
// let's look at the first 30 of them:
alert(number.toPrecision(30));
// 1.60000000000000008881784197001
答案 3 :(得分:3)
因为它是格式化功能。
答案 4 :(得分:1)
你需要一个字符串来尾随零。货币展示就是一个很好的例子。
答案 5 :(得分:-1)
问题在于使用toPrecision
。不用试试吧。
var isNotNumber = parseFloat('1.3');
alert(typeof isNotNumber); //=> number