『壹』 java double 精度问题
这种计算肯定会丢失精度的。如果不想丢失精度,可以用BigDecimal来表示
『贰』 java double最大精度
System.out.println(Double.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
这两个是double的最小值和最大值~
『叁』 java里面有没有long double类型或者比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型数据精确值问题
java中double类型数据是用64位来表示的,精度肯定是有限的,在需要更高精度的运算过程中,有两种方法可供参考:1. 自己用超过64位来表示一个double类型,比如用100个byte[]来表示一个double(800bytes);这样的话,double的加减乘除就需要自己实现一遍了。很多IT公司有这样的面试题。2. 用java自带的BigDecimal类可以方便做高精度的运算。(c++中是没有BigDecimal这种方面的类的,所以只能用第一种方法)
『伍』 java double精度输出问题
这里不能直接用System.out.println("%.6f",s);
java将print封装成了三个输出格式:
System.out.println(); 输出后换行
System.out.printf(); 输出带指定格式的内容
System.out.print(); 直接打印,不换行
要实现精度控制,需要用第2中格式的输出!
『陆』 一个关于JAVA中double精度误差的问题,详细及代码问题如下
因为递归方法计算函数中的这句:
return Math.round(replace*10000)/10000.0;
每次递归的返回值都被你精确到万分之一而四舍五入了,这样会有累积误差
而循环方法计算的就没有这个问题,直到最后才四舍五入一次。
正确做法是return Math.round(replace*10000)/10000.0;改成return replace;
递归完全返回后,对结果进行一次四舍五入。
『柒』 java中double型如何控制有效数字输出位数或精度
java中 double 类型只是一个简单类型,是不能其输出位数及精度是固定的
可以利用其它方法进行位数输出,如:
public static void main(String[] args) {
// 1. 使用 String.format() 方法
double data = 11.8982389283293;
System.out.println(String.format("%.2f", data));
// 2. 使用 printf 输出
System.out.printf("%.2f", data);
// 3. 使用 DecimalFormat 对象格式化
DecimalFormat format = new DecimalFormat("#.00");
System.out.println(format.format(data));
}
『捌』 java 转化为double类型后精度
http://blog.csdn.net/yinan9/article/details/17283081
『玖』 java中整数型的精度是几位
都是用二进制存的,整形的就是没有二进制小数,只保留整数位,你兑换成二版进制就清楚了权;
数据在机器的存储中有两种方式定点型和浮点型,看每个机器的设定 。而且是以二进制形式存储,比如浮点型以阶符,阶码;符号位,小数位;具体可以参考计算机组成原理的前两章。通俗解释就是把二进制转换成小数*2的n次方,n就是阶码,小数就是后边的。
『拾』 java和c语言的double精度问题
java 3.5802468781999996
C 3.5802468781999996 (printf("%.16lf", a+b);
你说不一样,是因为C默认输出6位小数吧。 printf("%lf", a+b);
这个精度是由计算机本身决定的,double类型的精度,在目前机器上的精度范围是15-16位小数之间。