【发布时间】:2020-01-16 05:41:46
【问题描述】:
当我执行以下除法并转换为浮点数时,我得到以下值:
float fltval = (float)(1183588296 / 65536.0); //18060.125
在没有强制转换的情况下执行相同的除法得到以下双精度值:
double dblval = 1183588296 / 65536.0; //18060.124145507813
我可以找到给定浮点值最接近的双精度值吗?
当我执行以下操作时:
double nearestdbl = (double)fltval;
我得到的是浮点值本身,而不是最接近的双精度值:
//nearestdbl = 18060.125
在这种情况下,如何获得更准确的值 (18060.124145507813) 或更接近的值?
我希望能够将结果存储在 32 位(浮点数)中,并且仍然能够通过将浮点值分配给双精度变量来得出更接近的双精度值。
但是,下面的代码给出了更准确的双精度值:
float f = 125.32f; //125.32
double d = (double)125.32f; //125.31999969482422
为什么它在第二个例子中找到了更接近的值,而不是在第一个例子中?
谢谢。
【问题讨论】:
-
在一张纸上写下“18060.124145507813”。撕下这张纸,去掉“4145507813”部分。把它写在另一张纸上,并请其他人为你恢复小数点后 11 位(不要给他们原始计算)。这就是您希望计算机可以为您做的事情。
-
你好像没有理解Rounding的概念,它不是无损的,不可逆的。另外,如果您可以从 32 位恢复它,为什么还要存在 64 位表示?无论哪种方式,这都不是结论性的。
标签: c# floating-point double precision division