将整数转换为Double并再次返回安全吗?
更具体地说,在以下情况下,originalValue
等于retrievedValue
的所有整数是否都是真的?
int originalValue = 42;
double backingField = (double)originalValue;
int retrievedValue = (int)backingField;
一些背景/动机: 我正在用很多接口在C#中编写许多微服务。对于以秒为单位的时间间隔,某些客户端将它们作为整数发送,而其他客户端作为浮点值发送。我需要存储它们并返回与客户端发送给我的值相同的值。 我的问题的目标是,如果可以安全地假设的话,当我检索整数但将所有值存储为双精度时,在检索客户端上强制转换为整数将始终返回原始值。 尤其是通过在逗号后截断任何值来完成转换。
任何强制转换为double的值都可以小于整数的值吗,例如42-> 41.9999999999999?
答案 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 选项。否则,如果另一个客户端需要某种格式的内容,而该格式具有隐式转换而又不损失精度,那您就容易了。