1

関数に与えられた数値を最も近いペンス全体に丸める関数があります。

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

ただし、関数に入力された数値は、最も近い1ペンスに切り上げる必要がありますが、小数点以下2桁に切り上げる必要があることに気付きました。

例えば

15.236562213541684は=15.24になります  
9846.65456169846は=9846.66になります

リターンを変更するだけの場合だと思いました(Math.round(a c)/ c); 戻るには(Math.ceil(a c)/ c);

明らかに私は非常に間違っていました。

この問題について何か助けはありますか?

** 編集 **

これが私が達成しようとしている公式です多分それは助けになるでしょう

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

たとえば

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

誰かが上記を行うための関数を正しくすることができますか?

これが私が持っている現在のコードへのリンクです...それは私が最初にJavaScriptを始めたときに作った非常に古い式です(これは少し前です)が、私は当時のように今でも良くありません。

誰かがそれをクリーンアップして、なぜそれが上記の機能と一致するように機能しないのかを理解できるかどうかを確認できますか?

4

6 に答える 6

5

これにはすでに組み込み関数がありますが、これをNumber.toFixed(numDigits)使ってみませんか?

パラメーター:digits
小数点の後に表示される桁数。これは0から20までの値であり、実装はオプションでより広い範囲の値をサポートする場合があります。この引数を省略すると、0として扱われます。

戻り値:
指数表記を使用せず、小数点以下の桁数が正確に含まれる数値の文字列表現。数値は必要に応じて丸められ、小数部は指定された長さになるように必要に応じてゼロで埋められます。numberが1e+21より大きい場合、このメソッドは単にNumber.toString()を呼び出し、指数表記の文字列を返します。

例:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

この最後のものはあなたの例と一致しません-9846.65456169846小数点以下2桁に丸められるのは9846.65、ではなく、である必要があり9846.66ます。

于 2009-10-01T16:46:17.053 に答える
1

固定小数点演算を使用するためのアドバイスは良いアドバイスです。残念ながら、Javascriptには固定小数点演算はありません。すべての数値は倍精度浮動小数点数です。(まあ、明示的なサポートライブラリを取得しない限り、固定小数点演算はありません。)

テキストフィールドの入力をスクラブするために、私は数値を文字列として扱い始めました(可能な限り)。入力を小数点の左右の部分に切り刻み、整数値で作業します(必要に応じてMath.floor()を使用)。小数点以下第2位を超える数字を処理する必要がある場合は、それらをエラーとして扱うか(とにかくそれらはどういう意味ですか?)、または、もう一度、それらを分割して整数として処理します。

ユーザーが指定した値(つまり、テキスト入力フィールドからのもの)を扱っていない場合は、Javascriptでこれを行うべきではありません。これも、本当に必要な数値ツールがないためです。

于 2009-10-01T18:32:57.303 に答える
1

コードは、このタスクに必要なものよりも複雑です。小数点の両側の桁の長さに関係なく、小数点が常に安定した値を表すことがわかっている場合は、運が良かったです。

1)次に、元の数に100を掛けるだけです。

2)if(Number(x.charAt(indexOF( "。")+ 1))> 4){x + = 1}ここで、xはあなたの番号です

3)parseInt

4)100で割ると完了です。

于 2009-10-01T16:47:05.747 に答える
1

で置き換えるMath.round()Math.ceil()うまくいくはずです:バグはどこかにあるはずです。

isNaN(parseInt())また、数学関数はとにかく数値にキャストされるため、完全に削除することをお勧めしNaNます。それが不可能な場合は戻ります。これにより、関数も返さNaNれます。これは、ブール値よりも適切ですfalse

そしてところで:金銭的価値で浮動小数点演算を使用することは悪い考えです:代わりに固定小数点演算を使用してください!


何をしようとしているのかがわかったので、次に、例の目的の値を計算するコードを示します。

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

浮動小数点値を使用することによる不正確さを補うために最後の支払いを通常どおりに丸める必要があるため、すべての計算でに変更round()ceil()ても機能しませんでした。

一般に、整数演算のみを使用する方がよいため、すべての値に値を乗算し、値を100出力する場合にのみ変換します。

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;
于 2009-10-01T17:48:41.670 に答える
0

いいえ、あなたは正しかった。

私はあなたのコードをceilmodifictaionでテストしました、そしてそれは動作します。

于 2009-10-01T16:49:57.153 に答える
0
function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

この場合、あなたが望む結果を出すためにそれを手に入れました。毎回動作するかどうかはわかりませんが、動作するようです。私は間違いなくそれがあなたが最初に望むように動作することを確認します。

于 2009-10-01T19:24:15.557 に答える