フロート値があります:12345.6489
これを使用してフォーマットする場合:
(12345.6489f).ToString( "F1")
それから私はの結果を得る
12345.7
しかし、これは12345.6であるはずなので、正しくありません。
なぜこれが起こるのか誰かが理解していますか?もう1つのヒントは、フォーマットする前にdoubleにキャストすると正しい結果が返されることです。また、float値が少し小さい場合(たとえば1234.6489)も、正しい結果が得られます。
フロート値があります:12345.6489
これを使用してフォーマットする場合:
(12345.6489f).ToString( "F1")
それから私はの結果を得る
12345.7
しかし、これは12345.6であるはずなので、正しくありません。
なぜこれが起こるのか誰かが理解していますか?もう1つのヒントは、フォーマットする前にdoubleにキャストすると正しい結果が返されることです。また、float値が少し小さい場合(たとえば1234.6489)も、正しい結果が得られます。
これは、私が以前に尋ねた質問に関連しているようです。.NETのDouble.ToStringメソッドでのラウンド2回のエラー
.ToString("G")
自分の番号に電話をかけると、正しく丸められることに注意してください12345.65
。四捨五入した数値を小数第1位に四捨五入すると、問題が発生します。
以前に自分の質問を調べたところ、ラウンド2回のエラーとして説明できない例もいくつか見つかったので、そのスレッドも確認してください。
追加:(正確に)aで表すことができる任意の数は、float
(多くのゼロビットで)aで表すこともできることに注意してくださいdouble
。次のトリックを使用できます(質問にも記載されています)。
float x = 12345.6489f;
string trick = ((double)x).ToString("F1");
この質問をありがとう!調査に従事することは非常に興味深い主題です。しかし、私はメダルの相手に言及したかった。あなたは次のように尋ねました:
(12345.6489f).ToString( "F1")
それから私はの結果を得る
12345.7
しかし、これは12345.6であるはずなので、正しくありません。
さて、この文字列フォーマットルーチンの正しい出力と間違った出力をどのように理解したのでしょうか。これらのフォーマット文字列は、丸めの目的で使用されることは想定されていません。そして、ドキュメントはそれについて明確に述べています:
正直なところ、私が最初にあなたの質問から数を見たとき、最初のアイデアは、ハンス・パッサントが彼の答えで言及した丸めアルゴリズムについてでした。したがって、そのようなアルゴリズムが選択されたのも驚きではありません。実際にはかなり直感的です:)浮動小数点数をフォーマットするためのアルゴリズムとして単純な切り捨てを検討するのも驚きではありません。それでもかなり正確で有効です。
したがって、これらすべてが非常に興味深く、バグ/パラドックス/奇跡のように見えるという事実にもかかわらず、これは実際には、別のことを行うように設計された(そして実際にはかなりうまくいく)関数からの私たちの間違った期待です。