2011-12-01 57 views
1

我有时倾向于使用(double)(long)(a * b/c)将结果的整数部分存储为double。这对于负数也适用。用于检索double的整数部分的Java类型转换为double

有没有更好的方法来实现同样的事情,因为我认为类型转换是一个代价高昂的操作。

请注意我正在寻找整数部分的数字,而不是四舍五入的值。 例如:

MyObj.setDouble((double)(long)(522.99)) 
MyObj.getDouble() returns 522.0 and not 523.0 

谢谢。

+12

你相信吗?你是否执行过任何分析,以确定这是真正的应用程序中的重大性能影响? –

+1

不要猜测,测量,因为即使你十多年来一直在做这类事情,你会惊讶你错了多少次。 ;)通常'Math.floor'和'Math.round'比使用模型慢2-4倍,但你应该自己测试一下。 –

+0

那么,我没有对此进行任何分析。我的错。我不应该没有证据就跳到结论。虽然我想摆脱两步式类型化,因为这看起来很丑。 –

回答

0

性能不是问题。但代码(double)(long)(a*b/c)是丑陋的。

double d = a*b/c;一模一样double d = (double)(long)a*b/c;

从下移动到上的类型时,却从未需要执行铸造:实际上,你如果分配结果为'双变量不需要铸造的。原语(例如intdouble)和类别(例如ArrayListList)是正确的。

+0

即使两个结果都是double类型,'2 * 5/3'与'(double)(long)(2 * 5/3)'的结果并不相同。 –

+0

当然,那些2,5和3应该被解释为双打,而不是整数或长整数... –

4

尝试Math.rint(double)Math.round(double)。无论性能差异如何,它至少更清晰简洁。

[编辑]

在回答您的澄清的问题 - “我怎么得到整数部分双无铸造”(尽管你的头衔询问四舍五入),试试这个:

public static double integerPart(double d) { 
    return (d <= 0) ? Math.ceil(d) : Math.floor(d); 
} 
integerPart(522.99); // => 522d 
integerPart(-3.19); // => -3d 

当然,由于它使用了比较和方法调用,所以此表单可能不会比铸造更快。

+0

这不会解决我的问题,因为我想整数部分而不是四舍五入的值。 –

+0

@ManishMulani:看到我更新的答案。此外,请考虑编辑您的问题(特别是标题),具体询问获取数字的*整数部分*而不是*舍入*。 – maerics

+0

我曾经使用这种方法(ceil和floor),直到我发现Math.ceil(-0.12)返回-0.0而不是0.0。不幸的是,对于-0.0和0.0,equals()方法的行为不同。 –

0

Math.floor(double)怎么样我不能看到整数部分和排序之间的区别。

+0

这不适用于负数。 Math.floor(-3.19)会给-4.0 –