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
。
有什么想法吗?我知道这是一个新手问题,我已经用谷歌搜索了几个小时,仍然很困惑。
【问题讨论】:
那么你不会只测试传入的值是否大于最大整数值吗?还是您更关心该值是否包含小数部分? 那么在这个世界上,int
或 double
的价格是 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四舍五入的方法
ruby 确定是否由机器人发出请求。来自http://stackoverflow.com/questions/5882264/ruby-on-rails-how-to-determine-if-a-r
LF.391.Determine If Array Is Min Heap