查看此代码:
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
Godeke.. 10
从文档:"将表示Number对象的字符串返回到指定的精度."
toPrecision()似乎用于格式化输出,在这种情况下,字符串是最合理的结果.它代表了一种不会被进一步操纵所破坏的形式的最终输出.
如果你想要计算精度的一些截断,我倾向于乘以10 ^ n,其中n是我想要保留的数字,从中获取一个整数,然后再次除以相同的整数.但这并不完美:在某些情况下,您可能会邀请溢出.坦率地说,我更喜欢在服务器上进行更复杂的财务计算,我有货币,二进制编码的十进制或类似的数字类型.
从文档:"将表示Number对象的字符串返回到指定的精度."
toPrecision()似乎用于格式化输出,在这种情况下,字符串是最合理的结果.它代表了一种不会被进一步操纵所破坏的形式的最终输出.
如果你想要计算精度的一些截断,我倾向于乘以10 ^ n,其中n是我想要保留的数字,从中获取一个整数,然后再次除以相同的整数.但这并不完美:在某些情况下,您可能会邀请溢出.坦率地说,我更喜欢在服务器上进行更复杂的财务计算,我有货币,二进制编码的十进制或类似的数字类型.
假设你有一个像'1.6'的数字.如果将其格式化为右侧有6个零,则会得到"1.600000".对于计算机,它仍然是与1.6相同的数字,但是对于您和您的网站,如果您的所有数字都具有不同的长度(例如,这可能会伤害解析器),则不一样.
因此,为了避免它,toPrecision返回一个字符串,否则解释器会将数字重新格式化为"1.6".
目的toPrecision
是将a的有效十进制数字截断Number
为指定的数量.但是Number
s 的内部表示的数据类型是二进制 IEEE-754 double.因此,在大多数时间内不可能存储精确的返回值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