4

私は次のステートメントを持っています:

float diff = tempVal - m_constraint.getMinVal();

tempValはfloatとして宣言され、getMinVal()float値を返します。

私は次のプリントアウトを持っています:

diff = 0.099999995、tempVal = 5.1、m_constraint.getMinVal()= 5.0

差分0.1だと思いますが、上記の数値ではありません。どうやってするか?

4

4 に答える 4

3

フロートはIEEE754数値を表すためにを使用し、そのシステムにはいくつかの丸め誤差があります。

浮動小数点ガイド

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

IEE754のウィキペディア

算術演算を行っていて、正確である必要がある場合は、BigDecimalfloatを使用しないdoubleでください。

于 2012-11-07T05:33:56.160 に答える
1

値を内部に保存する方法のため、float と double は完全に正確に 2 のべき乗の合計に分解できる数値しか保存できません (絶対値と相対値に関する特定の制約内で)。

したがって、正確に格納できない数値を格納または計算を実行しようとすると、最後の桁でエラーが発生します。

通常、float と double をいくつかの予防策を講じて使用すれば、これは問題になりません。

  • 必要以上の精度の「スペア」桁を持つ浮動小数点プリミティブのサイズを使用します。

  • 多くのアプリケーションでは、これはおそらく、float をまったく使用しない(代わりに double を使用する) ことを意味します。精度が非常に低く、除算を除いて、多くのプロセッサでパフォーマンス上の利点はありません。

  • FP 番号を印刷するときは、実際に印刷して、必要な精度の桁数のみを考慮し、最後の桁を含めないでください (String.format を使用してください)。

  • 任意の桁数の精度が必要な場合は、代わりに BigDecimal を使用してください。

于 2012-11-07T05:45:31.417 に答える
0

ingポイント番号exactで結果を得ることができません。floatそのためにFixedPointライブラリを使用する必要があるかもしれません。参照:http ://sourceforge.net/projects/jmfp/

于 2012-11-07T05:34:13.390 に答える
0

Java は、 IEEE 754で定義された 2 進浮動小数点表現を使用して実数をエンコードします。すべての有限表現と同様に、潜在的な表現よりもはるかに多くの実数が存在するため、すべての実数を正確に表現することはできません。正確に表現できない数値 (あなたの場合は 0.1 など) は、最も近い表現可能な数値に丸められます。

于 2012-11-07T05:37:46.660 に答える