14

私はhtml、javascript、cssに非常に慣れていないので、私の質問があなたにとってばかげているように聞こえる場合はご容赦ください。toFixed()私の質問は、関数が10進数を丸めないようにするにはどうすればよいですか。

これが私のリンクです:http://jsfiddle.net/RWBaA/4/

私がやろうとしているのは、ユーザーがテキストボックスに入力するたびに、入力が有効な10進数であるかどうかをチェックすることです。同時に、入力が有効な通貨であるかどうかも確認したいと思います。つまり、小数点の右側に2つの数値しか追加できないということです。問題は、ユーザーが小数点以下3番目の数値を入力した場合、3番目の数値が5以上の場合、小数点以下2番目の数値は100分の1に四捨五入されることです。

テスト入力:

  入出力  
123456.781-> 123456.78

123456.786-> 123456.79

なぜ私のコードはクロームの矢印キーを許可しないのですか?

助けてください。あなたがより良い解決策を持っているなら、あなたは自由に提案することができます。前もって感謝します。

4

7 に答える 7

15

それはさらに簡単です:

function truncateToDecimals(num, dec = 2) {
  const calcDec = Math.pow(10, dec);
  return Math.trunc(num * calcDec) / calcDec;
}

それで:

truncateToDecimals(123456.786) -> 123456.78
于 2017-05-25T15:39:32.433 に答える
11

数値を最初に最も近いセントに丸めます(切り捨て)。

val = Math.floor(100 * val) / 100;

編集これは例えば1.13では失敗することが指摘されています。私は自分自身をもっとよく知っているべきだった!

1.13の内部浮動小数点表現は1.13よりもわずかに小さいため、これは失敗します。これに100を掛けると、113ではなく112.99999999999998578915が生成され、それを切り捨てると1.12になります。

質問を読み直してみると、実際には入力検証を実行しようとしているだけのようです(以下を参照)。この場合、通常のフォーム検証手法を使用する必要があり、まったく使用.toFixed()しないでください。この関数は、数値を使用して計算するのではなく、数値を表示するためのものです。

$('#txtAmount').on('keypress', function (e) {
    var k = String.fromCharCode(e.charCode);
    var v = this.value;
    var dp = v.indexOf('.');

    // reject illegal chars
    if ((k < '0' || k > '9') && k !== '.') return false;

    // reject any input that takes the length
    // two or more beyond the decimal point
    if (dp >= 0 && v.length > dp + 2) {
        return false;
    }

    // don't accept >1 decimal point, or as first char
    if (k === '.' && (dp >= 0 || v.length === 0)) {
        return false;
    }
});
于 2012-05-30T00:54:09.223 に答える
7

これを試してみることができます、それはあなたの小数を丸めません

/**
 * @param {any} input 
 * @param {number} decimals 
 */
var toFixed = function(input, decimals) {
  var arr = ("" + input).split(".");
  if (arr.length === 1) return input;
  var int = arr[0],
      max = arr[1].length,
      dec = arr[1].substr(0, decimals > max ? max : decimals);
  return decimals === 0 ? int : [int, "." , dec].join("");
}
于 2015-09-11T05:39:00.550 に答える
5

さらに、toFixed()が小数点以下を四捨五入するのを防ぎ、数値を小数点以下2桁にするために、これを使用できます。

val = (Math.floor(100 * val) / 100).toFixed(2);
于 2014-12-17T14:42:26.927 に答える
1

四捨五入を避けたい場合...例 1.669 => 1.67、548.466 => 548.47

関数の結果は次のようになります:1.669 => 1.66、548.466 => 548.46

次に、次のJQuery関数が役立ちます。テストされ、正しく機能しています。

<input name="a" type="text" id="a" size="7%" tabindex="2">




  $('#a').keyup(function(e){
        if($(this).val().indexOf('.')!=-1){ 
            if($(this).val()=="." && $(this).val().length==1){
                this.value = parseFloat(0).toFixed(1);
            }else if($(this).val().split(".")[1].length > 2){                
                if( isNaN( parseFloat( this.value ) ) ) 
                    return;
                  this.value = $(this).val().split(".")[0]+"."+$(this).val().split(".")[1].substring(0,2);
            }   
        }
   });
于 2016-05-06T10:48:35.770 に答える
0

これは本当にばかげているように聞こえるかもしれませんが、数学的に丸めを防ぐのはなぜですか?

基本的に、あなたがしていることは、値を半分の精度ポイントだけ変位させることです。このようにして、丸めは床になります。

通常:0から4は0を作ります5から9は10を作ります

精度ポイントの半分を差し引いた後:-4(6になる)から-1(9になる)00を作る0から4は0を作る

0.5 / 10 ^ Nを減算する必要があります。この場合、小数点以下2桁の場合0.5 / 10 ^ 2 = 0.5 / 100 = 0.005小数点以下4桁の場合、0.00005を減算する必要があります。

ただし、浮動小数点がコンピューターとCPUで機能する方法のため、これに使用するのに十分な精度があることを確認する必要があります。したがって、CPUがそれを台無しにできない程度まで精度を削除することを強くお勧めします。

num = 123456.786
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

num = 123456.781
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

num = 123456.789
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

于 2021-05-22T10:31:24.577 に答える
0

これはテストされ、すべての場合に機能します。

function truncateTwoDecimals(num, dec = 2) {
  const totalDecimal = countDecimals(num);
  if (totalDecimal === 1) {
    dec = 1;
  }
  if (totalDecimal === 2) {
    return num;
  }
  const calcDec = Math.pow(10, dec);
  return Math.trunc(num * calcDec) / calcDec;
}
function countDecimals(value) {
  if(Math.floor(value) === value) return 0;
  return value.toString().split(".")[1].length || 0; 
}
const res = truncateTwoDecimals(1.13);
console.log(res);
console.log(truncateTwoDecimals(4492903605.9));

于 2021-06-16T08:20:01.690 に答える