0

解決すべき興味深い状況があります。それはクイズのようなものです:)

シンプルな電卓を再作成する必要があり、上/下の 2 つのボタンがあります。この 2 つのボタンの機能はシンプルで、現在の値を取得し、合計 1 または 1 を取得します。そのため、値を文字列に変換する小さな関数を作成し、34.1 の場合は新しい値 0.1 を作成します。加算または減算します。

- (float)findFloatValueToAdd:(NSString *)aString
{
  NSMutableString *val = [NSMutableString stringWithCapacity:aString.length];

  for (int i = 0; i < aString.length; i++)
    [val appendFormat:@"0"];

  if ([aString rangeOfString:@"."].location != NSNotFound)
    [val replaceCharactersInRange:NSMakeRange([aString rangeOfString:@"."].location, 1)
                       withString:@"."];

  [val replaceCharactersInRange:NSMakeRange(aString.length-1, 1)
                     withString:@"1"];

  return [val floatValue];
}

主な問題は、23.1234212 のように小数が多い場合です。上に行かなければならない場合は、23.12342 に直接ジャンプし、同じように下に移動します。23.12342 から下がり続けると、23.12341 > 23.1234 になりますが、その後 23.1233>23.1232>23.1231 になります...

では、この問題を本当に解決するにはどうすればよいでしょうか。

みんなありがとう!

4

1 に答える 1

1

コメントの 1 つが言うように、これは宿題のように聞こえます... 探索するための 2 つのアイデア:

1) 結果をどのように表示していますか? %5.2f などの形式が何を意味するのかわからない場合は、調べてください - 形式の仕様を調べてください。しかし、これは明らかな切り捨てを説明するかもしれません...

数字を使用してやりたいことを正確に行うのは難しいです。コンピュータは基数 2 の算術演算を使用し、浮動小数点は正確な桁数の範囲が限られています - 数学とは異なります。それが意味をなさない場合、分数 1/3 を考慮してください。その 10 進表現は何ですか? 0.333333333 ad nasuem. ある表現の値は、別の表現では正確に同等ではない場合があります。これは、ユーザーが書き込む 10 進数と、コンピューターによる 2 進浮動小数点でのその表現についても同じです。そう:

2) コードは、浮動小数点数の文字列表現で始まります。これは、数字と小数点に制限されているように見えます。つまり、指数はありません。次に、追加したい数値の文字列を作成します。次に、浮動小数点に変換すると、問題が発生し始めます。なぜ浮動小数点に変換するのですか? これはすべてstringで行うことができます。最後の文字 (一番右) から始めて、それを調べて 1 つ「追加」します。したがって、'1'必要'2'な場合は 、文字が の'9'場合は'0'と 1 の「キャリー」が必要です。次の文字に移動します...

于 2012-06-22T18:48:30.940 に答える