【发布时间】:2011-11-10 00:14:40
【问题描述】:
我试图通过显示 1.2(如果是 1.2)和 1(如果是 1)来美化程序。问题是我已将数字作为双精度数存储到数组列表中。如何检查 Number 是 double 还是 int?
【问题讨论】:
-
你能澄清一下你是指任何整数还是只想要 32 位签名的
int值?
我试图通过显示 1.2(如果是 1.2)和 1(如果是 1)来美化程序。问题是我已将数字作为双精度数存储到数组列表中。如何检查 Number 是 double 还是 int?
【问题讨论】:
int 值?
好吧,你可以使用:
if (x == Math.floor(x))
甚至:
if (x == (long) x) // Performs truncation in the conversion
如果条件为真,即if 语句的主体执行,则值为整数。否则,它不是。
请注意,这会将 1.00000000001 视为仍然是双精度值 - 如果这些值已经计算(因此可能只是“非常接近”整数值),您可能需要添加一些容差.另请注意,对于非常大的整数,这将开始失败,因为它们无论如何都不能在 double 中精确表示 - 如果您处理的范围非常大,您可能需要考虑使用 BigDecimal。
编辑:有更好的方法来解决这个问题 - 使用 DecimalFormat 您应该能够使其仅 可选 产生小数点。例如:
import java.text.*;
public class Test
{
public static void main(String[] args)
{
DecimalFormat df = new DecimalFormat("0.###");
double[] values = { 1.0, 3.5, 123.4567, 10.0 };
for (double value : values)
{
System.out.println(df.format(value));
}
}
}
输出:
1
3.5
123.457
10
【讨论】:
int 本身。
另一个使用模数运算符 (%) 的简单直观的解决方案
if (x % 1 == 0) // true: it's an integer, false: it's not an integer
【讨论】:
我是 C# 程序员,所以我在 .Net 中对此进行了测试。这也应该在 Java 中工作(除了使用 Console 类来显示输出的行。
class Program
{
static void Main(string[] args)
{
double[] values = { 1.0, 3.5, 123.4567, 10.0, 1.0000000003 };
int num = 0;
for (int i = 0; i < values.Length; i++ )
{
num = (int) values[i];
// compare the difference against a very small number to handle
// issues due floating point processor
if (Math.Abs(values[i] - (double) num) < 0.00000000001)
{
Console.WriteLine(num);
}
else // print as double
{
Console.WriteLine(values[i]);
}
}
Console.Read();
}
}
【讨论】:
或者也可以使用这种方法,我发现它很有帮助。
double a = 1.99;
System.out.println(Math.floor(a) == Math.ceil(a));
【讨论】:
你可以使用:
double x=4;
//To check if it is an integer.
return (int)x == x;
【讨论】: