Eam*_*ney 77 java floating-point
浮点数是32个二进制数字,双数字是64个二进制数字吗?文档太难理解了.
所有位都转换为有效数字?或者小数点的位置是否占用了一些位?
mar*_*cus 95
float:32位(4字节),其中23位用于尾数(约7位小数).8位用于指数,因此浮点数可以使用这8位将小数点"移动"到右侧或左侧.这样做可以避免在尾数中存储大量零,如0.0000003(3×10 -7)或3000000(3×10 7).有1位用作符号位.
double:64位(8字节),其中52位用于尾数(约16个十进制数字).11位用于指数,1位用于符号位.
由于我们使用的是二进制(只有0和1),当数字非零时,尾数中的一位隐式为1(float和double都使用此技巧).
此外,由于所有内容都是二进制(尾数和指数),因此转换为十进制数通常不准确.像0.5,0.25,0.75,0.125这样的数字是精确存储的,但0.1不是.正如其他人所说,如果你需要精确存储美分,不要使用float或double,请使用int,long,BigInteger或BigDecimal.
资料来源:
http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers
http://en.wikipedia.org/wiki/Binary64
http://en.wikipedia.org/wiki/Binary32
999*_*ars 25
答案很长:
浮点数有三个组成部分:
从本质上讲,这是有效的sign * 2^exponent * (1 + fraction).数字的"大小",它的指数,与我们无关,因为它只缩放小数部分的值.知道log??(n)给出的位数n,†我们可以确定浮点数的精度log??(largest_possible_fraction).因为在浮法商店2点的可能性的每个比特的二进制数n位可以存储数达2? - 1(共2? 值,其中一个值是零).这有点毛茸茸,因为事实证明浮点数的存储比它们可以使用的分数少一点,因为零是特殊表示的,所有非零数字都至少有一个非零二进制位.‡
结合这一点,浮点数的精度
数位是,浮点数的分数位数log??(2?)在哪里n.32位浮点数具有24位分数,精度为≈7.22十进制数字,64位双精度具有53位分数,精度为≈15.95十进制数字.
有关浮点精度的更多信息,您可能需要阅读有关机器epsilon的概念.
† n ? 1至少 - 对于其他数字,您的公式看起来更像
?log??(|n|)? + 1.
‡"此规则被称为前导位约定,隐式位约定或隐藏位约定."(维基百科)
Den*_*ret 17
来自java规范:
浮点类型是float和double,它们在概念上与单精度32位和双精度64位格式IEEE 754值和操作相关联,如IEEE标准二进制浮点运算,ANSI/IEEE标准754-1985(IEEE,纽约).
由于在不了解IEEE754基础知识的情况下很难对数字做任何事情,这里是另一个链接.
重要的是要理解精度不均匀,并且这不是对整数的精确存储.
一个例子 :
double a = 0.3 - 0.1;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
版画
0.19999999999999998
Run Code Online (Sandbox Code Playgroud)
如果您需要任意精度(例如出于财务目的),您可能需要大十进制.
一个正常的数学答案.
理解浮点数被实现为表示指数和其余部分的一些位,大部分用于数字(在二进制系统中),其中一个具有以下情况:
如果最低有效位改变,则指数高,例如10²³,两个相邻的distinghuishable数字之间会出现较大的差异.此外,基数为2的小数点使得许多基数为10的数字只能近似; 1/5,1/10是无穷无尽的数字.
所以一般情况下:如果您关心有效数字,则不应使用浮点数.对于计算的货币金额,e,a,最好使用BigDecimal.
对于物理学,浮点数双倍是足够的,浮动几乎从不.此外,处理器的浮点部分FPU甚至可以在内部使用更多的精确度.
| 归档时间: |
|
| 查看次数: |
143928 次 |
| 最近记录: |