2012-01-06 50 views
14

我在读C中的数据类型。我发现long double的范围比java中的double多。对于非常庞大的数字,我们可以在C中使用long double。如果我想在java中存储相同的数字,我们必须做什么?我们可以使用哪种数据类型?在java中是否有任何long double的替换?

在Java双取8个字节(64位)IEEE 754它涵盖的范围从 4.94065645841246544e-324D到1.79769313486231570e + 308D(正或负)。

longdouble in c takes 10 bytes (80 bits) 

谁能告诉我,有没有在java中的任何更换longdouble的

+3

尝试BigDecimal。 – 2012-01-06 06:55:33

+0

Bigdecimal不是数据类型,我们不能直接使用算术运算符进行算术运算。 – 2012-01-06 07:13:49

+0

'long double'在C中是编译器特有的,在大多数平台上它与'double'的大小相同。 – 2012-01-06 07:39:29

回答

9

虽然不是替代品,但您可以使用java.lang.math.BigDecimal.You可以大致储存数十亿位数字,直到内存不足。它是一个任意的精度级别,它会像你想要的一样大,直到你的计算机内存不足。

按照BigDecimal的文档:

不可变的,任意精度的有符号十进制数。 BigDecimal 由一个任意精度整数非缩放值和一个非负32位整数比例组成,它表示小数点右边的 位数。 BigDecimal代表的数字是 (unscaledValue/10scale)。 BigDecimal提供了 操作,用于基本算术,缩放操作,比较,散列和格式转换。 BigDecimal的

+1

但我不能使用算术运算符进行加法,减法等算术运算 – 2012-01-06 07:15:44

+0

@SunilKumarSahoo它具有同样的事情。有人建议Java支持BigInteger和BigDecimal的操作符。 – 2012-01-06 08:03:50

+0

和BigDecimal不会遭受不精确的错误 – 2012-01-06 08:42:21

3

没有直接替代Java编写的。

您可以使用BigDecimal来达到此目的。

你应该明白,你的双倍值越大,你在数学运算中将会得到更大的精度损失。 BigDecimal可以帮助你意识到这个问题。

下面是代码示例使用的BigDecimal:

String decimalString = "1423545135143513.523"; 
BigDecimal decimal = new BigDecimal(decimalString); 

By this link你可以找到与BigDecimal类的用法例子很多。

+0

但我不能使用算术运算符进行加法,减法等算术运算 – 2012-01-06 07:14:47

+0

您可以。例如decimal.divide(new BigDecimal(“11.11”)); 请通过我发布的链接阅读API。 我编辑了我的文章,按照链接学习一些例子。 – Artem 2012-01-06 07:16:31

+0

decimal.divide()不是一个运算符,它是一种方法?我在我的评论中提到我们不能使用算术运算符 – 2012-01-06 07:21:30

2

至于原始类型,没有double和float的旁白,它处理浮点。

但是,BigDecimal可能是你在找什么。

+0

但我不能使用算术运算符进行加法,减法等算术运算 – 2012-01-06 07:14:56

+0

不能使用普通算术运算符,因为这是一个对象。你将不得不使用API​​中的方法,比如.add(),.subtract()等等。 这有点乏味,但作为回报,你将拥有更多的力量和其他奇特的操作。但要小心分割,因为它会抛出异常,如果它是1/3,那么它将是非终止的十进制扩展。 – HeavenAgain 2012-01-06 07:25:10

1

文档状态:

附加(BigDecimal的被加数) 返回BigDecimal,其值为(this +被加数),其标是为max(this.scale(),augend.scale ())。

import java.math.BigDecimal; 

    public class AddTwoBigNumbers{ 
     public static void main(String[] args) { 
     BigDecimal num1, num2; 
     num1 = new BigDecimal(50.00035); 
     num2 = new BigDecimal(100.0025); 
     Sum(num1, num2); 
     } 

     public static void Sum(BigDecimal val1, BigDecimal val2){ 
     BigDecimal sum = val1.add(val2); 
     System.out.println("Sum of two BigDecimal numbers: "+ sum); 
     } 
    } 
0

没有,但你可以使用Java本地接口来调用执行使用长双类型的计算一个本地方法。然后您可以将其存储在10个字节中或截断它。

如果最终截断为double是可以接受的,取决于您使用的VM,可能中间值存储在long double中。在这种情况下,你不需要本地方法。