このコードを表示:
function testprecision(){
var isNotNumber = parseFloat('1.3').toPrecision(6);
alert(typeof isNotNumber); //=> string
}
私は数を期待していたでしょう。'isNotNumber' が実数でなければならない場合は、再キャストが解決策です。
alert(typeof parseFloat(isNotNumber)) //=> number
【追記】ご回答ありがとうございます。精度は、私が結論付ける用語としてはそれほど正確ではありません。数値の合計桁数または小数桁数を表すことができます。オランダ (私の出身地) のほとんどの人は、精度を「小数桁数」で考えています。JavaScript の toPrecision メソッドは最初の表現に関係しているため、混乱を招きます。とにかく、この方法は「偽の精度」を導入することを可能にしますよね? 固定しなければならない 2 番目の意味については、同じことが当てはまります (文字列を返す、誤った精度の可能性)。
とにかく、車輪の再発明を主な趣味として、ここで集めた知識を使用して、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