doubletolongjava
❶ java 的long轉換double問題
long是高於double精度的一個基礎變數類型,你在這里的強行轉換會產生精度缺失的問題。
這個是我運行你的代碼的結果,可以看出精度的缺失吧?
long是一個長整形變數,而double是雙精度的浮點數(其實就是小數)
然後再這里b/1000就是等於12,因為b是長整形的,他的計算結果也會事長整形的
所以需要在計算前先將b強制裝換為double型的,才可以保證精度不缺失
❷ java中將一個double類型的數強制轉換為long 型是四捨五入嗎
Java 中 long 是一個整數基本類型, 長度為64bits, 即8位元組.而double存在小數;如果帶小數點的double轉long型必定會造成數據變化!那麼,是怎麼變化的呢?
由此可見,java double轉long型是取整運算;
❸ 在JAVA中把double類型轉換成long類型,丟失數據位是什麼,為什麼
double是浮點型,long是整數型,以上語句轉換時小數部分沒有了,這就是丟失。javadouble轉long型是取整運算,用Double封裝下基本類型double,再調用longValue方法。Double(doublevalue)
longlongValue(),將此Double值作為long類型返回(通過強制轉換為long類型),詳細步驟:
1、首先在visualstudio中用c#語言進行類型轉換,新建項目命名"longdouble",項目結構圖如下。
❹ Java中的Long和Double類型
Java中的原子操作包括:
1)除long和double之外的基本類型的賦值操作
2)所有引用reference的賦值操作
3)java.concurrent.Atomic.* 包中所有類的一切操作。
但是java對long和double的賦值操作是非原子操作!!long和double佔用的位元組數都是8,也就是64bits。在32位操作系統上對64位的數據的讀寫要分兩步完成,每一步取32位數據。這樣對double和long的賦值操作就會有問題:如果有兩個線程同時寫一個變數內存,一個進程寫低32位,而另一個寫高32位,這樣將導致獲取的64位數據是失效的數據。因此需要使用volatile關鍵字來防止此類現象。volatile本身不保證獲取和設置操作的原子性,僅僅保持修改的可見性。但是java的內存模型保證聲明為volatile的long和double變數的get和set操作是原子的。(from
http://www.iteye.com/topic/213794)
舉個例子來說:(example is from
http://stackoverflow.com/questions/17481153/long-and-double-assignments-are-not-atomic-how-does-it-matter)
public class UnatomicLong implements Runnable {
private static long test = 0;
private final long val;
public UnatomicLong(long val) {
this.val = val;
}
@Override
public void run() {
while (!Thread.interrupted()) {
test = val;
//兩個線程都試圖將自己的私有變數val賦值給類私有靜態變數test
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new
UnatomicLong(-1));
Thread t2 = new Thread(new
UnatomicLong(0));
System.out.println(Long.toBinaryString(-1));
System.out.println(pad(Long.toBinaryString(0),
64));
t1.start();
t2.start();
long val;
while ((val = test) == -1
|| val == 0) {
//如果靜態成員test的值是-1或0,說明兩個線程操作沒有交叉
}
System.out.println(pad(Long.toBinaryString(val), 64));
System.out.println(val);
t1.interrupt();
t2.interrupt();
}
// prepend 0s to the string to make it the target
length
private static String pad(String s, int targetLength) {
int n = targetLength - s.length();
for (int x = 0; x < n; x++) {
s = "0" + s;
}
return s;
}
}
❺ java中,如何將double類型數據轉換為16進制字元串或者是16進制位元組數組
1、轉化為long類型
先Double.doubleToLongBits/Double.doubleToRawLongBits,得到long類型,
例子:
longl=0x0102030405060708L;
2、轉化為16進制字元串或數組
byte[]b=newbyte[8];
b[0]=(byte)(l&0x000000000000FFL);
b[1]=(byte)((l&0x0000000000FF00L)>>8);
b[2]=(byte)((l&0x0000000000FF0000L)>>16);
b[3]=(byte)((l&0x00000000FF000000L)>>24);
b[4]=(byte)((l&0x000000FF00000000L)>>32);
b[5]=(byte)((l&0x0000FF0000000000L)>>40);
b[6]=(byte)((l&0x00FF000000000000L)>>48);
b[7]=(byte)((l&0xFF00000000000000L)>>56);
❻ java中將一個double類型的數強制轉換為long 型是四捨五入嗎
不是的,
(double)
b/1000;
這一步是把b先轉化為Double型
然後進行計算
因為計算的類型中有double型
所以1000自動轉化為double型
結果就是double型
12.345
b/1000;
這一步是long型/long型
得到的結果也是long型
就是12
然後轉化為double型
就是12.0
❼ java中,有沒有把double轉成時間類型的方法
沒有
你把double的轉成long就可以了
不過強轉的時候會丟失精度
❽ 在Java語言中 long和double的范圍
long的取值范圍是2的63次方-1到負的2的63次方。
double的取值范圍比較復雜建議去看標准化協議,即使是雙精度的double在精確計算上誤差也比較大建議使用bigdecimal
❾ 最近看java基礎,發現數值不一樣的long和double類型的數據比較的結果居然會相同,請高手答疑!
自動類型提升,也就是說兩個基礎數據類型進行值對比的時候,類型不一樣
低的會自動提升到高的數據類型,然後進行對比!
你可以做個實驗,
int 10;
byte 10;
long 10;
double 10;
進行比對,你會發現全都是true!
❿ java大神快快來,Double.doubleToLongBits()這是干什麼的,API看不懂
doubleToLongBits方法根據 IEEE 754 浮點雙精度格式 ("double format") 位布局,返回指定浮點值的表示形式。
語法 public static long doubleToLongBits(double value)
返回值:表示浮點數的位。
參數:value為雙精度(double)浮點數。
第 63 位(掩碼 0x8000000000000000L 選定的位)表示浮點數的符號,第62~52位(掩碼
0x7ff0000000000000L 選定的位)表示指數,第51~0位(掩碼 0x000fffffffffffffL
選定的位)表示浮點數的有效數字(有時也稱為尾數)。如果參數是正無窮大,則結果為
0x7ff0000000000000L;如果參數是負無窮大,則結果為 0xfff0000000000000L;如果參數是 NaN,則結果為
0x7ff8000000000000L。
在所有情況下,結果都是一個 long 整數,將其賦予 longBitsToDouble(long) 方法將生成一個與 doubleToLongBits 的參數相同的浮點值(所有 NaN 值被壓縮成一個「規范」NaN 值時除外)。
示例 本示例通過doubleToLongBits方法將double數值轉換為IEEE 754 浮點雙精度格式 ("double format") 位布局的形式。
double d = 123.456;
long l = Double.doubleToLongBits(d);
System.out.println(i);