2012-02-24 3 views
3

私は、年、ジュリアン日、時、分を表すいくつかの整数を読んでいます。私は分数日に変換しようとしています。私は724043.939の結果を取得する必要があります2001, 083, 22, 32の値を使用してなぜ浮動小数点数は整数保持を主張していますか?

int YYYY, JJJ, HH, MM; 

float datenumber = (YYYY*360.0f)+(JJJ*1.0f)+((HH*1.0f)+(MM/60.0f))/24.0f; 

。代わりに724044が得られます。

私はfloatとしてキャストされたすべてのintを持っています。なぜ彼らは整数のままですか?

editはい、私は出力をcoutで表示していました。 setprecisionは問題を解決しました。ありがとうございます。

+5

どのように最終値を表示していますか?デバッガ、 'printf()'? – trojanfoe

+1

結果をどのように印刷していますか?問題があなたのprintステートメントにある可能性があります – vmpstr

+0

[my test](http://ideone.com/KhmMZ)によると、 'printf'は期待される結果を表示しますが、' cout'は「間違った」値を表示します。 –

答えて

0

キャスティングを行うコードが他にある場合を除いて、方程式を実行した後にキャストしているので、キャスト前の等式のintを使ってフロートを戻しています小数点以下を削除します。

最初は浮動小数点として宣言してください。

float YYYY, JJJ, HH, MM; 
+1

彼は '*'と '/'に対する他のオペランドとして 'float'定数を使用していますので、' int 'はそれらの操作が行われる前に' float'にプロモートされます。つまり、あなたが言及したことは問題ではありません。編集:ダンFとは以下の通りです。 –

+1

浮動小数点演算が関係する場合、常に浮動小数点演算を行いませんか?したがって、あなたがキャストしない限り、 'int * float'は切り捨てられません... –

+0

ああ、知っていたはずです...私の悪い – wvm2008

1
あなたは TWO物事行う必要があり

:最大(cout.setprecision(16)

  • に、あなたの精度を設定し

    1. doubledouble dateNumberYYYY*360.0)に変換
  • +0

    それは[私のテスト](http://ideone.com/KhmMZ)です。それ以上のことがなければなりません。 –

    +0

    @RobKennedy:それを倍に変更し、精度を変更するとそれを修正する必要があります。 – Jacob

    0

    次理由があります - 1.あなたはprintinているかもしれませんそれらを間違ってgします。 2.整数で除算する代わりにfloatを使用してください。 200.0

    3

    により200分割して問題を分割する

    -代わり例は、電話番号やあなたの計算ではありません。あなたがそれを表示しているのはそれだけです。 coutは6桁で十分です。もっと必要な場合はsetprecisionを使用してください。あなたがベンジャミンの答えで提供された例では、あなたの入力と出力の値から判断する

    std::cout << std::setprecision(10) << datenumber; 
    

    demo

    +0

    いいえ、ここには何かがあります。これをチェックしてください:http://codepad.org/TfRlPfOh – Jacob

    +0

    @Jacobあなたは 'float'として変数*の値が本当に* 432000なので、出力を取得します。残りの部分を保持するのに十分な精度はありません値の[my exact-float page](http://www.cs.wisc.edu/~rkennedy/exact-float?number=432000.0034722222)を参照してください。 –

    +0

    6人で十分だと決めたのは「息子」ではありませんでした。それはC++標準でした。 Sixは新しい 'basic_ios'子孫のデフォルト精度です。 –

    0

    、私は問題は、単に浮動小数点精度であることを賭けて喜んで。何かを浮動小数点として宣言しているだけで、それがどんなサイズの数値にも対応できるわけではありません。問題は、あなたの年のコンポーネント(1200 * 360 = 432000)があなたのMMコンポーネント(5/60/24 = .00347222)よりも大きいことにあります。浮動小数点数は正確ではないので、MM部分の小数部分は無視されます。浮動小数点として.000001〜123456789を追加し、出力が何であるかを確認してください。

    関連する問題