私は次のステートメントを持っています:
float diff = tempVal - m_constraint.getMinVal();
tempVal
はfloatとして宣言され、getMinVal()
float値を返します。
私は次のプリントアウトを持っています:
diff = 0.099999995、tempVal = 5.1、m_constraint.getMinVal()= 5.0
差分は0.1だと思いますが、上記の数値ではありません。どうやってするか?
私は次のステートメントを持っています:
float diff = tempVal - m_constraint.getMinVal();
tempVal
はfloatとして宣言され、getMinVal()
float値を返します。
私は次のプリントアウトを持っています:
diff = 0.099999995、tempVal = 5.1、m_constraint.getMinVal()= 5.0
差分は0.1だと思いますが、上記の数値ではありません。どうやってするか?
フロートはIEEE754
数値を表すためにを使用し、そのシステムにはいくつかの丸め誤差があります。
すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと
算術演算を行っていて、正確である必要がある場合は、BigDecimalfloat
を使用しないdouble
でください。
値を内部に保存する方法のため、float と double は完全に正確に 2 のべき乗の合計に分解できる数値しか保存できません (絶対値と相対値に関する特定の制約内で)。
したがって、正確に格納できない数値を格納または計算を実行しようとすると、最後の桁でエラーが発生します。
通常、float と double をいくつかの予防策を講じて使用すれば、これは問題になりません。
必要以上の精度の「スペア」桁を持つ浮動小数点プリミティブのサイズを使用します。
多くのアプリケーションでは、これはおそらく、float をまったく使用しない(代わりに double を使用する) ことを意味します。精度が非常に低く、除算を除いて、多くのプロセッサでパフォーマンス上の利点はありません。
FP 番号を印刷するときは、実際に印刷して、必要な精度の桁数のみを考慮し、最後の桁を含めないでください (String.format を使用してください)。
任意の桁数の精度が必要な場合は、代わりに BigDecimal を使用してください。
ingポイント番号exact
で結果を得ることができません。float
そのためにFixedPointライブラリを使用する必要があるかもしれません。参照:http ://sourceforge.net/projects/jmfp/
Java は、 IEEE 754で定義された 2 進浮動小数点表現を使用して実数をエンコードします。すべての有限表現と同様に、潜在的な表現よりもはるかに多くの実数が存在するため、すべての実数を正確に表現することはできません。正確に表現できない数値 (あなたの場合は 0.1 など) は、最も近い表現可能な数値に丸められます。