C# 将int值转换为双倍和反向安全吗

C# 将int值转换为双倍和反向安全吗,c#,casting,C#,Casting,将整数强制转换为双精度并再次返回安全吗 更具体地说,在以下场景中,originalValue等于retrievedValue是否适用于所有整数: int originalValue = 42; double backingField = (double)originalValue; int retrievedValue = (int)backingField; 一点背景/动机: 我正在用C编写很多微服务,有很多接口。对于以秒为单位的时间间隔,一些客户端将它们作为整数发送,另一些客户端将它们作为

将整数强制转换为双精度并再次返回安全吗

更具体地说,在以下场景中,originalValue等于retrievedValue是否适用于所有整数:

int originalValue = 42;
double backingField = (double)originalValue;
int retrievedValue = (int)backingField;
一点背景/动机: 我正在用C编写很多微服务,有很多接口。对于以秒为单位的时间间隔,一些客户端将它们作为整数发送,另一些客户端将它们作为浮点值发送。我需要存储它们并返回与客户端发送给我的值相同的值。 如果可以安全地假设,我的问题的目标是,当我检索一个整数,但将所有值存储为双倍时,检索客户端上的转换为整数将始终返回原始值。 特别是当转换通过截断逗号后的任何值来完成时

任何转换为double是否会导致值低于整数,例如42->41.999999999999?

有预定义的从int到long、float、double或decimal的隐式转换。如前所述

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

查看ms文档

然后,对于逆运算

在从int到float的转换过程中,可能会丢失精度而不是量级

Float to double也是一种隐式强制转换

您可以使用一种类似于测试框架的技术,该框架断言具有容差的数字类型的相等性

对我的批评者来说

链接到你的微服务问题,引用Sam Newman的话

在你接受的东西上要自由,在你发送的东西上要保守

如果您有一个客户机需要整数,请将数据存储为double或decimal,并使用一些机制防止转换为int时丢失精度,如Math.Floor或Math.天花以及适当的舍入选项。否则,如果另一个客户机需要某种格式,而这种格式有一个隐式转换而不损失精度,那么您就可以轻松完成。

有从int到long、float、double或decimal的预定义隐式转换。如前所述

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

查看ms文档

然后,对于逆运算

在从int到float的转换过程中,可能会丢失精度而不是量级

Float to double也是一种隐式强制转换

您可以使用一种类似于测试框架的技术,该框架断言具有容差的数字类型的相等性

对我的批评者来说

链接到你的微服务问题,引用Sam Newman的话

在你接受的东西上要自由,在你发送的东西上要保守


如果您有一个客户机需要整数,请将数据存储为double或decimal,并使用一些机制防止转换为int时丢失精度,如Math.Floor或Math.天花以及适当的舍入选项。否则,如果另一个客户端需要某种格式,而这种格式有一个隐式强制转换,并且不会丢失精度,那么您就可以轻松完成。

只需强制转换,所有内容都会超过小数点。我知道你可能不需要做任何取整,但为了让这个答案更完整,这里有独家新闻。要向上或向下取整,可以使用以下方法。这将向上或向下取整,并提供一个参数,用于在中途发生故障时如何处理。您还可以使用或方法在强制转换之前隐式地向上取整或向下取整。以下是一些例子:

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;

简单的施法只会使所有内容都超过小数点。我知道你可能不需要做任何取整,但为了让这个答案更完整,这里有独家新闻。要向上或向下取整,可以使用以下方法。这将向上或向下取整,并提供一个参数,用于在中途发生故障时如何处理。您还可以使用或方法在强制转换之前隐式地向上取整或向下取整。以下是一些例子:

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;

它是什么类型的整数?我的问题与语言无关。我主要从事c语言的工作,但对backingField是另一种语言或数据库的情况特别感兴趣。假设整数的长度为32位。Doubles可以精确地存储所有整数值,因此,如果只有32位,至少可以避免这个问题。我想不出任何其他的原因来解释为什么它不好,但我不是浮点实现方面的专家,所以我会让其他人回答。双精度类型在分数上可能不准确,但在整数上没有精度问题。任何10个基数的整数都可以精确地表示为二进制数-但处理浮点时并非如此-这就是浮点算术有时返回舍入数的原因。通过浮点规范可能是明智的,但我做了一个快速测试,测试了int.MinValue和int.MaxValue之间的所有int值,在转换为double并返回int后,所有值都完全相同。这是什么类型的整数?我的问题与语言无关。我主要从事c语言的工作,但对backingField是另一种语言的情况特别感兴趣
r数据库。假设整数的长度为32位。Doubles可以精确地存储所有整数值,因此,如果只有32位,至少可以避免这个问题。我想不出任何其他的原因来解释为什么它不好,但我不是浮点实现方面的专家,所以我会让其他人回答。双精度类型在分数上可能不准确,但在整数上没有精度问题。任何10个基数的整数都可以精确地表示为二进制数-但处理浮点时并非如此-这就是浮点算术有时返回舍入数的原因。通过浮点规范可能是明智的,但是我做了一个快速测试,测试了int.MinValue和int.MaxValue之间的所有int值,在转换为double和back-to-intAll之后,所有的int值都完全相同。这意味着,您可以在这些类型之间转换,而无需指定直接转换。它没有说明这些类型转换的效果,只说明您可以在这些类型之间进行转换,而无需指定直接转换。我知道,如果我使用舍入法,我一点问题都没有。但是从double到int的默认转换只是逗号后的所有内容的条带,我不能保证与我的服务通信的其他客户端是如何进行转换的……我知道,如果我使用舍入,我将不会有任何问题。但是默认的从double到int的转换只是在逗号之后去掉所有内容,我不能保证其他与我的服务进行通信的客户端是如何进行转换的。。。