导航:首页 > 编程语言 > javadouble的精度

javadouble的精度

发布时间:2021-10-14 08:21:23

『壹』 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封装成了三个输出格式:

  1. System.out.println(); 输出后换行

  2. System.out.printf(); 输出带指定格式的内容

  3. 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位小数之间。

阅读全文

与javadouble的精度相关的资料

热点内容
苹果地区版本 浏览:818
word字体行距怎么调 浏览:117
苹果4s怎么拆内屏幕 浏览:988
win10调节分辨率 浏览:437
lol灯笼升级 浏览:196
大数据该怎么理解 浏览:226
plc程序自检 浏览:408
苹果6s都有什么配件 浏览:756
安卓502u盘模式 浏览:423
流量币微信群 浏览:147
周期性提醒代码 浏览:617
千陌大巴免费wifi认证 浏览:440
iphone4swifi连接上不能上网 浏览:674
汇编图形变换程序 浏览:173
网易云刷听歌数量代码 浏览:130
自动删除过时文件 浏览:47
php怎么创建数据库表 浏览:84
mysql大数据库备份 浏览:471
win10允许udp广播 浏览:888
wordpress新浪微博 浏览:156