繁体   English   中英

C# float 到 double 的转换

[英]C# float to double conversion

当我执行以下除法并转换为浮动时,我得到以下值:

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 值。

但是,以下代码给出了更准确的 double 值:

float f = 125.32f;  //125.32
double d = (double)125.32f; //125.31999969482422

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

谢谢。

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

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

您似乎以某种方式认为浮点数18060.125的最近双精度18060.12518060.124145507813 这不是真的。 浮点数18060.125最接近的双精度18060.12518060.125 这个值可以用doublefloat同样准确地表示。

为什么将18060.124145507813float会得到18060.125呢?

由于最近的floatdouble 18060.12414550781318060.125 请注意,这与您的理解相反。 这并不意味着最接近float 18060.125 double float 18060.12518060.124145507813 ,因为在两个相邻的float之间有许多double float

不可能回到“您从中获得floatdouble ”,因为当您转换为float ,您正在丢失信息。 您正在从 64 位值转换为 32 位值。 那些信息不会回来。

为什么铸造 125.32f 工作呢?

因为float不能像double那样准确地表示数字 125.32,所以当你转换为 double 时,它​​会试图进一步接近它。 尽管看起来float可以准确地表示125.32 100%,但这只是ToString方法造成的错觉。 始终使用某种格式化方法格式化您的浮点数,例如string.Format

转换数据类型时,您总是会得到精度较低的类型......考虑将 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM