2

このコードを表示:

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
4

6 に答える 6

10

ドキュメントから:「Numberオブジェクトを表す文字列を指定された精度で返します。」

toPrecision() は、出力の書式設定を目的としているようです。この場合、文字列が最も妥当な結果です。これは、さらなる操作によって破壊されない形式で最終出力を表します。

計算上の理由で精度の切り捨てを行う場合、私は 10^n を掛ける傾向があります。ここで、n は保持したい数字であり、そこから整数を取り、同じ値で再度割ります。ただし、これは完全ではありません。状況によっては、オーバーフローを引き起こす可能性があります。率直に言って、私はサーバー上でより複雑な財務計算を行うことを好みます。そこでは、通貨、バイナリ コード化された 10 進数、または同様の数値型があります。

于 2009-02-02T16:04:37.777 に答える
10

「1.6」のような数値があるとします。右側にゼロが 6 個あるようにフォーマットすると、「1.600000」になります。コンピューターにとっては 1.6 と同じ数値ですが、あなたとあなたの Web サイトにとっては、すべての数値の長さが異なる場合は同じではありません (たとえば、パーサーを傷つける可能性があります)。

したがって、それを避けるために、 toPrecision は文字列を返します。そうしないと、インタープリターが数値を再フォーマットして、再び「1.6」になります。

于 2009-02-02T16:08:05.307 に答える
5

の目的は、a の有効な10 進数を指定された量toPrecisionに切り捨てることです。ただし、 s の内部表現のデータ型は、IEEE-754 doubleのバイナリです。したがって、ほとんどの場合、正確な戻り値を格納することは不可能です。この不正確さの結果として、戻り値の 10 進数の桁数が無限になり、無効になります。NumberNumberNumbertoPrecision

したがって、この問題に対する唯一の合理的な解決策は、10 進数を返すことです。現在、10 進数の妥当な JS データ型は String のみです。


Number10 進数に使用した場合の 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
于 2010-12-11T09:09:15.803 に答える
3

整形機能だから。

于 2009-02-02T16:03:45.423 に答える
1

末尾のゼロの文字列が必要です。通貨表示はその良い例です。

于 2009-02-02T16:07:11.953 に答える
0

問題は、の使用ですtoPrecision。なしで試してみてください。

var isNotNumber = parseFloat('1.3');
alert(typeof isNotNumber); //=> number
于 2009-02-02T16:20:46.543 に答える