use*_*253 3 java floating-point
给出下面的测试代码及其输出.当我从数值获得浮点值时,精度会丢失..任何人都可以告诉我为什么这种行为以及如何处理这个问题?
public static void main(String[] args)
{
try
{
java.lang.Number numberVal = 676543.21;
float floatVal = numberVal.floatValue();
System.out.println("Number value : " + numberVal);
System.out.println("float value : " + floatVal);
System.out.println("Float.MAX_VALUE : " + Float.MAX_VALUE);
System.out.println("Is floatVal > Float.MAX_VALUE ? " + ( floatVal > Float.MAX_VALUE));
}catch(Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Number value : 676543.21
float value : 676543.2
Float.MAX_VALUE : 3.4028235E38
Is floatVal > Float.MAX_VALUE ? false
Run Code Online (Sandbox Code Playgroud)
为什么浮点值小于Float.MAX_VALUE?
Tas*_*kos 21
float
s通常最多可达6位有效数字.您的电话号码是676543.21
8位有效数字.您将看到超过6位数的错误,并且您执行的计算越多,这些错误将很容易传播到更有效的数字.如果你重视自己的理智(或精确度),请使用double
s.浮标甚至不能准确计算超过1000万.
现在,您有2位有效数字,这表明您有可能想要代表货币 - 请勿.使用您自己的类,使用定点算法在内部表示值.
现在,至于Float.MAX_VAL
哪个是3.4028235E38,意思是3.4028235*10 ^ 38,这比你的值大约10 ^ 32倍.注意那里的'E'?这是指数.
我爱这些.但我会快速无痛地做到这一点.
浮点数和小数(也称为浮点数)也不会精确保存在内存中.但是我不想在这里考虑浮动精度与精度问题,我只想指出一个链接 - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
至于你的另一个问题,lemme就是这样说的,因为花车以科学记数法存储.
floatVal = 6.765432E6 = 6.7 * 10^6
MAX_VALUE = 3.4E38 = 3.4 * 10^38
Run Code Online (Sandbox Code Playgroud)
MAX_VALUE比浮点数大32个数量级.随意看看这里http://steve.hollasch.net/cgindex/coding/ieeefloat.html
几个月前我花了很多时间来比较和解决一些FP问题......
比较浮点数时尝试使用小三角洲.也许这个链接可以帮助你http://introcs.cs.princeton.edu/java/91float/
所有数据类型都有表示限制,因此存在限制的事实不应该令人惊讶.
float
使用24位作为其"尾数",其中包含所有有效数字.这意味着它有大约7位精度(因为2 ^^ 24大约是1600万)
double
它使用53位的"尾数",因此它可以精确地保持大约16位数.
归档时间: |
|
查看次数: |
22253 次 |
最近记录: |