正在将int转换为两倍并返回安全状态

时间:2018-10-31 19:52:29

标签: c# casting

将整数转换为Double并再次返回安全吗?

更具体地说,在以下情况下,originalValue等于retrievedValue的所有整数是否都是真的?

int originalValue = 42;
double backingField = (double)originalValue;
int retrievedValue = (int)backingField;

一些背景/动机: 我正在用很多接口在C#中编写许多微服务。对于以秒为单位的时间间隔,某些客户端将它们作为整数发送,而其他客户端作为浮点值发送。我需要存储它们并返回与客户端发送给我的值相同的值。 我的问题的目标是,如果可以安全地假设的话,当我检索整数但将所有值存储为双精度时,在检索客户端上强制转换为整数将始终返回原始值。 尤其是通过在逗号后截断任何值来完成转换。

任何强制转换为double的值都可以小于整数的值吗,例如42-> 41.9999999999999?

2 个答案:

答案 0 :(得分:0)

仅强制转换只会剥离小数点后的所有内容。我知道您可能不需要四舍五入,只是为了使答案更完整,这是它的独家新闻。要向上或向下取整,可以使用Math.Round()方法。这将向上或向下取整,并提供一个参数,说明中途如何处理。您还可以使用Math.Floor()Math.Ceiling()方法在转换前隐式舍入或舍入。以下是一些示例:

double num1 = 3.5;
double num2 = 3.2;
double num3 = 3.9;

(int)num1 // returns 3;
(int)num2 // returns 3;
(int)num3 // returns 3 also;
(int)Math.Round(num1) // returns 4
(int)Math.Round(num2) // returns 3
(int)Math.Round(num3) // returns 4
(int)Math.Floor(num1) // returns 3
(int)Math.Floor(num2) // returns 3
(int)Math.Floor(num3) // returns 3
(int)Math.Ceiling(num1) // returns 4
(int)Math.Ceiling(num2) // returns 4;
(int)Math.Ceiling(num3) // returns 4;

答案 1 :(得分:-4)

从int到long,float,double或十进制有预定义的隐式转换

  

任何整数类型都可以隐式转换为任何浮点类型。

在ms docs上检查Implicit numeric conversions table (C# Reference)

然后,进行逆运算

  

从int到float的转换中可能会丢失精度,但不会失去幅度。

浮动为double 也是隐式强制转换。

您可能会使用类似于测试框架的技术,该框架声明具有公差的数值类型是否相等。

致我的批评者(编辑)

链接到您的微服务问题,在此引用萨姆·纽曼(Sam Newman)

  

在接受的内容上保持自由,在发送的内容上保持保守。

如果您的客户要求整数,则将数据存储为双精度或十进制,并使用某种机制来防止在转换为int时(例如Math.Floor或{{1 }},并带有正确的 rounding 选项。否则,如果另一个客户端需要某种格式的内容,而该格式具有隐式转换而又不损失精度,那您就容易了。