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);