2

ここのnoobは、iPhoneの複利を計算したいと考えています。

float principal;
float rate;
int compoundPerYear;
int years;
float amount;

式は次のようになります。amount=principal*(1 + rate / CompoundPerYear)^(rate * years)

私は少し間違った答えを得る:

amount = principal*pow((1+(rate/compoundPerYear)), (compoundPerYear*years));

.1のレートでテストしていますが、デバッガーは.100000001を報告します。

私はそれを間違っていますか?ダブルスまたは特別なクラス(NSNumberなど)を使用する必要がありますか?

他のアイデアをありがとう!


さらに調査した結果、NSDecimalNumberクラスがまさに私が必要としているもののようです。今、私はこの悪い男の子の使い方を理解する必要があります。

4

2 に答える 2

6

double近づきますが、1/10を2進数で正確に表すことはできません(とにかく、IEEE浮動小数点表記を使用します)。

本当に興味がある場合は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを確認できます。別のSOスレッドから恥ずかしそうに盗まれたリンク。

簡単で汚い説明は、浮動小数点が2の小数乗(1 / 2、1 / 4、1 / 8、...)を表すビットでバイナリに格納されることです。これらの分数を正確に1/10に合計する数学的な方法はないため、0.1をIEEE浮動小数点表記で正確に表すことはできません。

double基数の前後により多くの数字を与えることによって数値の精度を拡張しますが、これを補うことができる方法で2進数の形式を変更することはありません。おそらく、後のどこかで余分なビットを取得するでしょう。

参照:

および他の同様のスレッド。


私が仕事から家に帰るドライブで熟考したさらなる拡張:これを処理できる1つの方法は、すべての金銭的価値をセントで(intとして)表し、データを表示するときにdollars.cents形式に変換することです。変換時に整数除算の切り捨てを利用できるため、これも実際には非常に簡単です。

int interest, dollars, cents;
interest = 16034; //$160.34, in cents
dollars = value / 100; //The 34 gets truncated: dollars == 160
cents = value % 100; //cents == 34
printf("Interest earned to date: $%d.%d\n", dollars, cents);

Objective-Cはわかりませんが、このCの例も理にかなっていると思います。繰り返しますが、これはそれを処理するための1つの方法にすぎません。また、データを表示する必要があるときはいつでも文字列のフォーマットを行う関数を使用することで改善されます。

あなたは明らかにそれを行うためのあなた自身の(さらに良い!)方法を思い付くことができます、しかし多分これはあなたが始めるのを助けるでしょう。他に誰か提案があれば、私も聞いてみたいです!

于 2010-08-06T21:43:52.493 に答える
2

簡単な答え:お金のために浮動小数点数を使用しないでください。

ほとんどのプラットフォームで機能する簡単な方法は、お金を最小単位の整数として表すことです。多くの場合、1/10または1/100セントが実際の基本単位ですが、最小単位は1セントのようなものです。

多くのプラットフォームでは、固定小数点の小数を表すことができる数値タイプも利用できます。

丸めを正しく行うようにしてください。財務簿記はしばしば銀行家の丸めを使用します。

于 2010-08-07T12:33:43.580 に答える