2016-07-12 1 views
-4

私はすばやいです(2.2を使用)。200.23 - 2000.2299999999999898に等しいと表示されています。私はコンピュータが不合理な数を正確に表すことができないことを知っていますが、なぜ有理数も正しく表現されていないのか分かりません。これは私のプログラムで生成された出力番号に影響を与え、問題につながります。私は数を定義し、その全体と小数部分を抽出しています上記のコードでSwift 2.2で丸め誤差が表示されています(たとえば、0.23ではなく0.22999999)。

var number:Double = 200.23    //Number I'm testing 

var left: Double = floor(number) // Extracting integer part 
var right: Double = number-left // Extracting fraction part 

:ここ

は、この動作を示すサンプル遊び場コード(私の実際のコードの一部の非常に単純なバージョン)です。小数部は 0.23である必要がありますが、それは 0.2299999999999898と表示されています。私は 200.23から 100.23に元の番号を変更した場合

は同様に、その後、小数部分は0.230000000000004

どのように私はこの問題を解決することができることが示されていますか?

編集:

この問題の背景について私は尋ねられました。私は数字をたくさん使う統計アプリケーションを設計していますが、実際には小さな組み込み電卓もあります。だから私が200.23 - 0.23を計算しようとしていて、0.23以外のものを見ると、彼は驚くでしょう!

+0

私は既に浮動小数点問題を知っています。しかし、どうすればそれを回避できますか?今日書かれたすべてのソフトウェアは、どうにかこの問題に対処することができます。 – Ahmad

+2

「コンピュータが非合理的な数字を正確に表現できないことは知っていますが、なぜ有理数も正しく表現されていないのはわかりません」それは事実ではありません。コンピュータはすべての有理数を正確に表すことはできません。小数点表記法(人間)は、不合理な数字を正しく表記することもできません。 – Evert

+0

整数を使用するだけです。1.23は123を意味します.836.92は、83692 – Kametrixom

答えて

0

変数rightに格納された値を丸めるには、round()関数を使用します。精度を指定するには

var number:Double = 200.23     

var left: Double = floor(number) 
var right: Double = number-left 

let roundedValue = round(right*100)/100 // Answer will be 0.23 
+0

丸めは誤った答えにつながることがあるので、残念ながら私には役に立たない近似解を提供します極端なケースをテストする)、また、自分自身の負担がある特定の計算に必要な近似を動的に把握する必要があります。しかし、答えを提案していただきありがとうございます。 – Ahmad

関連する問題