C#,DETERMINE *if* a double 可以成为 int 而没有任何损失[重复]

Posted

技术标签:

【中文标题】C#,DETERMINE *if* a double 可以成为 int 而没有任何损失[重复]【英文标题】:C#, DETERMINE *if* a double can become an int without any loss [duplicate] 【发布时间】:2011-10-25 19:58:02 【问题描述】:

可能重复:How to determine if a decimal/double is an integer?

我有一个独特的情况,所有数字都必须在我的数据库中保存为double 数据类型,但只有在某些情况下,超出整数级别的精度才有价值。

起初,我尝试只使用int,然后在这些独特的小数出现时抽象到一个新表,但是在这样做了几个星期之后,我现在可以看到它过于愚蠢并且浪费了我的时间。

我知道我可以将double 变成int。这很容易。我知道怎么翻译。我不知道如何测试翻译它。我基本上希望想出一个简短易懂的说法

这个数字真的是双精度数,还是只是一个整数?

如果它是一个 int (大多数时候,它会是),那么我会将它变成一个 int 并这样对待它。但是由于需求的唯一性,我还是要把数据库中的所有内容都保存为double

有什么想法吗?我知道这是一个新手问题,我已经用谷歌搜索了几个小时,仍然很困惑。

【问题讨论】:

那么你不会只测试传入的值是否大于最大整数值吗?还是您更关心该值是否包含小数部分? 那么在这个世界上,intdouble 的价格是 1.00 美元吗? 技巧问题:decimal “没有任何损失”是什么意思?你是说 10.000 可以变成 10 不损失,但 10.001 不能?在这种情况下,您需要定义可接受的损失有多大,因为您不能说 0。您需要说 +/- 0.001 或其他。 作为附加评论,我不确定我是否喜欢这种方法,因为它可能是整数,所以将某些东西视为整数。那不应该驱动你的逻辑。如果某事物应该是一个整数,那么把它当作一个整数对待。如果某事物恰好是一个整数,但它确实不需要是整数,则将其视为 应该 的类型。通常,给定列中所有值的类型应该是一致的。您应该在设计时做出决定,而不是运行时。 @Anthony:是的,这将是理想的,但在我的情况下这是不可能的。 【参考方案1】:

将其转换为int,看看它是否仍然相等:

if ((int)val == val)

(int)val 将截断任何小数部分。

请注意,如果数字太大而无法在 double 中保持完整的精度,这可能会出现意外行为。

【讨论】:

使用Math.Truncate 代替演员有什么好处吗?【参考方案2】:
double d = ...;

if(d == (int)d)
   //is int
else
  //is not int

当然,由于一些精度问题,这可能不会 100% 有效。你可以使用

double d = ...;

if(Math.Abs(d - (int)d) < Epsilon) //const double Epsilon = 0.000001;
   //is int
else
  //is not int

【讨论】:

【参考方案3】:

This similar post 向您展示如何确定双精度或小数是否有小数位。您可以使用它来确定它是什么类型,然后适当地存储。

从该帖子中接受的答案:

对于浮点数,n % 1 == 0 通常是检查小数点后是否有任何内容的方法。

public static void Main (string[] args)

    decimal d = 3.1M;
    Console.WriteLine((d % 1) == 0);
    d = 3.0M;
    Console.WriteLine((d % 1) == 0);

输出:

False
True

【讨论】:

是的,这就是我要找的。我忘记了模命令。谢谢。【参考方案4】:

试试这个

double x = ......

if (Math.truncate(x) == x)

....... (is integer, unless its so big its outside the bounds)

【讨论】:

以上是关于C#,DETERMINE *if* a double 可以成为 int 而没有任何损失[重复]的主要内容,如果未能解决你的问题,请参考以下文章

请教c#中double类型转化为long类型的方法, 以及对double四舍五入的方法

C#如何将double转为char

ruby 确定是否由机器人发出请求。来自http://stackoverflow.com/questions/5882264/ruby-on-rails-how-to-determine-if-a-r

LF.391.Determine If Array Is Min Heap

LF.85.Determine If One String Is Another's Substring

C#比较大小