4

dat.guiJavaScript ライブラリで作成した小さなメニューがあります。表示されるいくつかの初期値で別の行を使用します (これらの初期値はコードの実行中に変更されます)。

私の問題は、たとえば、値「15」を表示する代わりに、「15.0000」を表示したいということです。関数を使用しようとしましtoFixed(4)たが、成功しませんでした。

生の ( " toFixed(4)" 関数なしの) コード スニペットは次のとおりです。

var componentThetaInit = 15;
var componentPhiInit = 15;

var gui = new dat.GUI({
 autoplace: false, 
    width: 350, 
    height: 9 * 32 - 1
});

var params = {
StartingVector : '',
 ComponentVectorTheta : componentThetaInit,
 ComponentVectorPhi : componentPhiInit
};

gui.add(params, 'StartingVector').name('Starting Vector :');
controllerComponentVectorTheta = gui.add(params, 'ComponentVectorTheta', minComponentTheta, maxComponentTheta, 0.0001).name('Component θ ');
controllerComponentVectorPhi = gui.add(params, 'ComponentVectorPhi', minComponentPhi, maxComponentPhi, 0.0001).name('Component φ ');

今私は試しました:

 var params = {
    StartingVector : '',
     ComponentVectorTheta : componentThetaInit.toFixed(4),
     ComponentVectorPhi : componentPhiInit.toFixed(4)
    };

しかし、これは機能しません。実行前に取得したもののキャプチャを以下に示します (" 15" ではなく " 15.0000"):

フローティング表示なし

15.0000コードが実行されると、4 つの浮動小数点が適切に表示されます (値が整数でなくなるため)。これは実際には (アニメーション前の) 初期値であり、「 」ではなく「 」のように表示したいと考えています15

結果は、次のように宣言しても同じです。

var componentThetaInit = 15.0000;
var componentPhiInit = 15.0000;

私も試しました:

 ComponentVectorTheta : parseFloat(componentThetaInit.toFixed(4)),
 ComponentVectorPhi : parseFloat(componentPhiInit.toFixed(4))

誰かが何が間違っているかを見ることができれば、これはいいでしょう。

ありがとう

4

2 に答える 2

5

まず、いくつかのマイナーなバグ。いくつかの変数宣言が欠落していました。追加した:

var minComponentTheta = -10.0;
var maxComponentTheta = 100.0;
var minComponentPhi = -100.0;
var maxComponentPhi = 100.0;

2) autoplace パラメータ (autoPlace、大文字の P である必要があります) は、小数点以下の桁数とは関係ありません... UI を DOM に自動的に追加するオプションのようです。

これで実際に問題が解決するものはありません。javascriptから始まる問題です。このコードをコンソールに配置すると、同じ問題が発生します。

var a = 15.0000;
console.log(a);
// prints 15 and not 15.0000

数値が整数の場合、それは整数です。これを回避するには、デフォルト値を 15.0001 のような非整数値にすることができます。

これはおそらくあなたが探しているものではありません。したがって、dat.gui.js のコードを変更する場合は、入力の値を強制的に数値の文字列バージョンに設定することができます。このようなコードを見つけて、以下のコードをコピーして貼り付け、置き換えます。関数の最初の行の最後に toFixed を追加しただけです。ここで値を取得すると、数値ではなく文字列になることに注意してください。そのため、使用する前に parseFloat() を使用して計算する必要があります。

NumberControllerBox.prototype.updateDisplay = function updateDisplay() {
  this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision).toFixed(this.__precision);
  return _NumberController.prototype.updateDisplay.call(this);
};

縮小されていない JS バージョンでは、^ 2050 行にあります。これが希望どおりに機能することを確認しました 小数点以下4桁

于 2017-03-08T05:37:47.467 に答える
1

次のようにしておきます。

ComponentVectorTheta : componentThetaInit.toFixed(4),
ComponentVectorPhi : componentPhiInit.toFixed(4)

このことを考慮:

a = 15;            // a is an integer now
b = a.toFixed(4);  // b is the string "15.0000"
c = parseFloat(b); // c is a number (internally, probably an integer) 
d = c.toString(2); // d is the string "1111"
e = parseInt(d, 2);// e is an integer again
assert(a === e);   // true
于 2017-03-08T04:24:13.063 に答える