当执行以下除法并强制转换为浮点数时,将获得以下值:
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位(浮点数)存储结果,并且仍然能够通过将浮点值分配给double变量来得出更接近的double值。
但是,以下代码给出了更准确的双精度值:
float f = 125.32f; //125.32
double d = (double)125.32f; //125.31999969482422
为什么在第二个示例中而不是在第一个示例中找到更接近的值?
谢谢。
转换数据类型时,您总是会得到精度较低的类型...考虑将int转换为double的情况
int intVal = (int)(10.0/4);
double dblVal = 10.0/4;
//dblVal = 2.5 --- intVal = 2
dblVal = intVal;
//dblVal = 2.00;
底线:您无法同时保存内存和保存精度...
将double转换为float时,double值四舍五入为最接近的float值。如果double值太小或太大而无法容纳float类型,则结果为零或无穷大。查看此链接:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
(实际上,当我运行代码时,我得到的是18060.13
而不是18060.125
,但我会在答案中继续使用后者。)
我可以找到给定浮点值的最接近的双精度值吗?
您似乎以某种方式认为浮点数18060.125
的最接近的double值是18060.124145507813
?这不是真的。浮点数18060.125
的最接近双精度值是18060.125
。此值可以由double
和float
相等地准确表示。
为什么将
18060.124145507813
转换为float
会得到18060.125
?
因为最接近float
的double
是18060.124145507813
。请注意,这与您的理解相反。这并不意味着最接近18060.125
double
的float
是18060.125
,因为在两个18060.124145507813
值之间有许多double
值。
不可能回到“从中获得float
的double
”,因为当您转换为float
时,您正在丢失信息。您实际上是在丢弃32位。该信息不会返回。
为什么铸造125.32f起作用?
因为float
不能像float
那样准确地表示数字125.32,所以当您不能加倍时,它将尝试进一步近似。尽管double
can似乎可以100%准确地表示float
,但这只是125.32
方法造成的一种幻觉。请务必使用某种格式化方法来格式化您的浮点数,例如ToString
。