在Java

时间:2016-02-02 22:33:46

标签: java junit

我正在尝试使用Junit来测试java程序,而且我不确定如何测试上限违规。

具体来说,我写了一个简单的程序来转换公里和英里。

例如,这是从英里转换为公里的方法

    public static double mileToKm(double mile){
    //1.1170347260596139E308 / 0.621371192 = Double.MAX_VALUE
    try{
        if (mile < 0 || mile > 1.1170347260596139E308){
            throw new IllegalArgumentException();
        }
        else
            return mile / 0.621371192;}
    return 0;
}

所以,我想我的问题是双重的:首先,为什么我尝试时无法想出异常

mileToKm(1.1170347260596139E308 + 1)
在junit?我认为这是一个舍入问题,但如果是这样的话,我怎么能得到抛出的异常呢?

其次,对于从km转换为km的方法,如果参数大于Double.MAX_VALUE,我想抛出异常。我怎样才能传递这样的参数?如果我只是作为参数Double.MAX_VALUE * 10传递,我可以通过Junit测试,但我也在控制台中收到一条消息(这是所有在Eclipse Mars 4.5.1,顺便说一句),说'MAX = 1.7976931348623157E308'。参数必须是double,因此它不能是BigDecimal或类似的东西。

好吧,我说谎了,问题是三重的。这是怎么回事:

double value =  Double.MAX_VALUE * 0.621371192; //max_value * conversion factor
System.out.println(value);

打印1.1170347260596138E308,但接着是这两个陈述

System.out.println(value / 0.621371192);
System.out.println(Double.MAX_VALUE);

分别打印1.797693134862315 5 E308和1.797693134862315 7 E308。换句话说,我希望这两个值都等于Double.MAX_VALUE,但是第一个语句在E之前有一个5,而不是7.如何解决这个问题?非常感谢,希望这不是太过分了。

1 个答案:

答案 0 :(得分:0)

您对浮点数感到困惑。

首先,数字1.1170347260596139E308 + 1 无法表示使用Java中的基元,doubles have ~16 significant digits,并且该添加需要308位有效数字。

其次,如果使用中间存储, float / double操作不是幂等的(大多数时候甚至没有它)。浮点运算失去准确性,并且在科学领域中寻求在大型计算中保持准确性的算术方法(想想天气模型)。

第三,有Double.MAX_VALUE,它代表Java中原语中最大的可表示数字;唯一的其他值X使得X> Double.MAX_VALUE可以保留Double.POSITIVE_INFINITY,而且这不是真实的数字。