C#浮点到双转换

问题描述 投票:0回答:3

当执行以下除法并强制转换为浮点数时,将获得以下值:

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

为什么在第二个示例中而不是在第一个示例中找到更接近的值?

谢谢。

c# floating-point double precision division
3个回答
0
投票

转换数据类型时,您总是会得到精度较低的类型...考虑将int转换为double的情况

int intVal = (int)(10.0/4);
double dblVal = 10.0/4;
//dblVal = 2.5 --- intVal = 2
dblVal = intVal;
//dblVal = 2.00;

底线:您无法同时保存内存和保存精度...


0
投票

将double转换为float时,double值四舍五入为最接近的float值。如果double值太小或太大而无法容纳float类型,则结果为零或无穷大。查看此链接:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions


0
投票

(实际上,当我运行代码时,我得到的是18060.13而不是18060.125,但我会在答案中继续使用后者。)

我可以找到给定浮点值的最接近的双精度值吗?

您似乎以某种方式认为浮点数18060.125的最接近的double值是18060.124145507813?这不是真的。浮点数18060.125的最接近双精度值是18060.125。此值可以由doublefloat相等地准确表示。

为什么将18060.124145507813转换为float会得到18060.125

因为最接近floatdouble18060.124145507813。请注意,这与您的理解相反。这并不意味着最接近18060.125 doublefloat18060.125,因为在两个18060.124145507813值之间有许多double值。

不可能回到“从中获得floatdouble”,因为当您转换为float时,您正在丢失信息。您实际上是在丢弃32位。该信息不会返回。

为什么铸造125.32f起作用?

因为float不能像float那样准确地表示数字125.32,所以当您不能加倍时,它将尝试进一步近似。尽管double can似乎可以100%准确地表示float,但这只是125.32方法造成的一种幻觉。请务必使用某种格式化方法来格式化您的浮点数,例如ToString

© www.soinside.com 2019 - 2024. All rights reserved.