2012-01-06 12 views
14

C veri türlerini okuyordum. long double aralığının java'daki double değerinden daha fazla olduğunu buldum. Çok büyük bir sayı için C.'de uzun çift kullanabiliriz. Eğer aynı sayıyı java'da saklamak istiyorsam ne yapmalıyız? hangi veri türünü kullanabiliriz? Java çiftHerhangi bir uzun java çiftinin yerini alabilir mi?

IEEE 754. o + (pozitif veya negatif) 308D 1.79769313486231570e için 4.94065645841246544e-324D bir aralığı kapsar 8 bayt (64 bit) alır. Herkes bana söyleyebilir

longdouble in c takes 10 bytes (80 bits) 

java longdouble herhangi yedek

+3

BigDecimal'i deneyin. –

+0

Bigdecimal, aritmetik işlemlerini kullanarak aritmetik işlemleri doğrudan yapamadığımız bir veri türü değildir. –

+0

'long double', C dilinde belirli bir derleyicidir, çoğu platformda 'double' ile aynı boyuttadır. –

cevap

9

yerini tutmaz rağmen, bellek bitene kadar java.lang.math.BigDecimal.You kabaca basamak milyar saklayabilir kullanabilirsiniz. Onun keyfi bir hassas sınıf, bilgisayarınızın belleği bitene kadar istediğiniz kadar büyük olacak. BigDecimal belgelenmesi gereğince

:

Immutable, keyfi kesinlikte ondalık sayılar imzaladı. Bir BigDecimal ondalık noktasının sağındaki basamak sayısını temsil eden bir keyfi hassas tamsayıdır ölçeksiz değeri ve negatif olmayan bir 32 bit tamsayı ölçek oluşur. BigDecimal tarafından temsil edilen sayıdır (kalıbın üstüDeğeri/10 ölçek). BigDecimal temel aritmetik, ölçek manipülasyonu, karşılaştırma, hashing ve format dönüştürme için işlemleri sağlar. BigDecimal arasında

+1

Ancak aritmetik işlemciler için toplama, çıkarma vb. Gibi aritmetik hesaplamalar yapamıyorum. –

+0

@SunilKumarSahoo Aynı şeyi yapan bir yöntemi var. BigInteger ve BigDecimal için Java destek operatörleri önerildi. –

+0

ve BigDecimal, hata hatalarından muzdarip değildir –

3

Java hiçbir düz yedek Orada olmasıdır.

Bu amaçla BigDecimal kullanabilirsiniz.

Daha büyük duble değerdir anlamalıdır, hassas kayıp büyük Eğer matematiksel operasyonlarda kullanmaktan alacaktır. BigDecimal bu sorunun farkında olmanıza yardımcı olur.

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

By this link Eğer BigDecimal sınıfının kullanımı ile birçok örnek bulabilirsiniz:

İşte kod BigDecimal ile örnektir.

+0

Ancak, toplama, çıkarma vb gibi aritmetik hesaplamalar için aritmetik işlemcileri kullanamıyorum. –

+0

Yapabilirsiniz. Örneğin. decimal.divide (yeni BigDecimal ("11.11")); Lütfen, gönderdiğim bağlantıyı kullanarak API'yi okuyun. Gönderiyi düzenledim, linki takip edip bazı örnekleri öğreniyorum. – Artem

+0

decimal.divide() bir operatör değil, bir yöntem midir? Benim yorumumda aritmetik işleçler kullanamadığımızı belirttim –

2

basit tür için olduğu gibi, kayan nokta işleme çift ve şamandıra yok asides vardır.

Ama BigDecimal aradığınız şey olabilir.

+0

Ancak, toplama, çıkarma vb gibi aritmetik hesaplamaları için aritmetik işlemcileri kullanamıyorum. –

+0

Normal aritmetik işleçleri kullanamazsınız çünkü bu bir nesnedir. API'da .add(), .subtract(), vb. Gibi yöntemleri kullanmanız gerekecektir. Biraz can sıkıcıdır, ancak karşılığında daha fazla güç ve diğer fantezi operasyonlarınız olacaktır. Ancak bölüme dikkat edin, çünkü 1/3 gibi istisnalar atar, sonra da ondalık olmayan genişleme olur. – HeavenAgain

1

Belgeleri belirtmektedir: ölçeği (this.scale(), augend.scale maksimum bir değer BigDecimal (bu + augend) ve döner

eklenti (BigDecimal augend)()).

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

Hayır, ama uzun çift türünü kullanarak hesaplama yapan bir yerli yöntemi çağırmak için Java Native Interface kullanabilirsiniz.Daha sonra 10 byte saklayabilir veya kesebilirsiniz.

Çift kesilecek bir son kesme kabul edilebilirse, kullandığınız VM'ye bağlı olarak, ara değerlerin zaten uzun ikilikte saklanabiliyor olması olasıdır. Bu durumda, yerel yönteme ihtiyacınız yoktur.

İlgili konular