我正试图在java中将double转换为float。
Double d = 1234567.1234;
Float f = d.floatValue();我看到f的值是
1234567.1我不想打印一个字符串值的浮点。我只是想知道,在将double转换为float时,不丢失任何精度的最大位数是多少。我可以在java中显示8个以上的有效数字吗?
发布于 2015-08-27 19:40:15
float的精度约为7小数点,但由于浮子是以二进制形式存储的,这是一种近似。
要演示所述浮点值的实际精度,请尝试如下:
double d = 1234567.1234;
float f = (float)d;
System.out.printf("%.9f%n", d);
System.out.printf("%.9f%n", Math.nextDown(f));
System.out.printf("%.9f%n", f);
System.out.printf("%.9f%n", Math.nextUp(f));输出
1234567.123400000
1234567.000000000
1234567.125000000
1234567.250000000如您所见,对于这个数字,有效的十进制精度大约是1位小数位,或8位数字,但是如果您使用数字9876543.9876运行代码,您将得到:
9876543.987600000
9876543.000000000
9876544.000000000
9876545.000000000只有7位数的精确度。
发布于 2015-08-27 20:28:02
我只是想知道,在将double转换为float时,不丢失任何精度的最大位数是多少。
也许你没有意识到这一点,但是N位精度的概念已经是模棱两可。毫无疑问,你的意思是“基数为10的N位数字的精度”。但与人类不同的是,我们的电脑与基地2一起工作。
不可能在不丢失精度的情况下将每个数字从基数X转换到基数Y(保留的数字数量有限),例如,1/3的值在基3中完全准确地表示为"0.1“。在基数10中,它有无限多位数0.3333333333333.同样,基本10中通常完全可表示的数字,例如0.1,需要在基2中表示无限多个数字。另一方面,0.5 (基数10)可以精确地表示为0.1 (基数2)。
所以回到
我只是想知道,在将double转换为float时,不丢失任何精度的最大位数是多少。
答案是“这取决于价值”。常用的经验法则“浮点数大约有6到7位小数点精度”只是一种近似。它可以是更多或更少取决于价值。
在处理浮点时,相对精度的概念更有用,停止考虑“数字”,代之以相对误差。任何数字N(在范围内)都是可以表示的,误差最多为N/精度,精度是选择格式的尾数(例如,浮点数23 (+1),双精度52 (+1) )。因此,表示为浮点数的十进制数的最大逼近误差为N/ pow(2,24)。误差可能较小,甚至为零,但永远不会更大。
23+1来自于这样一种惯例,即浮点数字是按照选择的指数组织的,因此第一个尾数位总是1(只要有可能),因此不需要显式存储。物理存储的比特数,例如23,因此允许额外的一位精度。(有一种例外情况,即“只要有可能”就不适用,但让我们在这里忽略这一点)。
TL;博士:浮点数或双数没有固定的十进制数精度。
发布于 2015-08-28 06:57:05
这是一个简单的示例,支持不存在安全的十进制数的观点。
考虑0.1。
最近的IEEE 754 64位二进制浮点数具有精确的值0.1000000000000000055511151231257827021181583404541015625.。它将32位二进制浮点转换为0.10000000149011119384765625,比0.1远得多.
即使是一位重要的数字和一位小数位,也可能失去精确性。
除非你真的需要浮子的紧凑性,并且有非常宽松的精度要求,一般情况下最好坚持双倍。
https://stackoverflow.com/questions/32257543
复制相似问题