「java精度计算」java计算精度问题
本篇文章给大家谈谈java精度计算,以及java计算精度问题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java 中 精度计算BigDecimal 是永远不会丢失精度的吗,小数点后面几位都不会?
- 2、JAVA计算时实现数字计算结果高精度
- 3、Java中数据精度的问题
- 4、java中的精度是什么意思
- 5、Java程序精度问题
- 6、怎么控制精度在java
java 中 精度计算BigDecimal 是永远不会丢失精度的吗,小数点后面几位都不会?
精度由BigDecimal对象在创建时设定的或默认的MathContext算术环境对象决定。
精度precision的十进制有效数字位数可以指定的。小数点后几位等按有效数位的规则。
精度为0时,代表无限位数的准确精度。此时遇到计算1/3输出的循环小数1.333333..会抛出算术异常,而不是返回有限的有效数字结果。
JAVA计算时实现数字计算结果高精度
这个程序满足你的要求吧
public class BigNumber {
public static int[] add(int[] a, int[] b) {
int carry = 0;
int[] c = new int[a.length];
for(int i = a.length - 1; i = 0; i--) {
c[i] = a[i] + b[i] + carry;
if(c[i] 10000)
carry = 0;
else { // 进位
c[i] = c[i] - 10000;
carry = 1;
}
}
return c;
}
public static int[] sub(int[] a, int[] b) {
int borrow = 0;
int[] c = new int[a.length];
for(int i = a.length - 1; i = 0; i--) {
c[i] = a[i] - b[i] - borrow;
if(c[i] = 0)
borrow = 0;
else { // 借位
c[i] = c[i] + 10000;
borrow = 1;
}
}
return c;
}
public static int[] mul(int[] a, int b) { // b 为乘数
int carry = 0;
int[] c = new int[a.length];
for(int i = a.length - 1; i =0; i--) {
int tmp = a[i] * b + carry;
c[i] = tmp % 10000;
carry = tmp / 10000;
}
return c;
}
public static int[] div(int[] a, int b) { // b 为除数
int remain = 0;
int[] c = new int[a.length];
for(int i = 0; i a.length; i++) {
int tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * 10000;
}
return c;
}
public static void main(String[] args) {
int[] a = {1234, 5678, 9910, 1923, 1124};
int[] b = {1234, 5678, 9910, 1923, 1124};
int[] c = BigNumber.add(a, b);
for(int i = 0; i c.length; i++) {
System.out.print(c[i]);
}
System.out.println();
}
}
Java中数据精度的问题
我只知道大概的原因
System.out.println(a); 这句代码调用了a.toString();可能会有点影响
我看了看Float的toString方法:
public static String toString(float f) {
return new FloatingDecimal(f).toJavaFormatString();
}//我没有FloatingDecimal的源码,所以不知道toString()的时候会不会损失精度
Java 中的 float 是用2进制来表示的, 但是二进制不能准确的表示一些数比如:1/10,
System.out.println(2.1-1.9); //0.10000000000000009 这个结果因CPU而异
大概就是这种原因吧。
一些intel的cpu在计算a*b+c的时候会把a*b写到80位的寄存器里,然后再+c,最后把最终结果截断成64位的double,这样能得到更加精确的结果。
但是‘跨平台’的Java要确保系统和硬件无关,可以使用strictfp关键字。
你要得到精确的无关平台的计算,那只能使用BigDecimal了。
java中的精度是什么意思
1.精度是指的各种数据类型的位宽
byte 8 位
short 16 位
int 32 位
long 64 位
float 32 位
double 64 位
char 16 位
2.数据降级都会损失精度的,体现在各种数据类型能表示的范围不一样。举个例子,float 32 位,根据 IEEE 754 32位 标准,首位正负位,后面 8 位指数位,余下 23 位是小数位;
double 64 位,根据 IEEE 754 64位 标准,首位正负位,后面 11 位指数位,余下 52 位是小数位。
相比之下当然位数愈多精度愈高了,其他整数类型的精度就简单了,首位表示正负,所有的都表示数值,位数越高当然精度越高。
Java程序精度问题
代码有1个错,错在最后一行:
long l=(float)f;//强制转换会舍去小数部分(不是四舍五入)
改成
long l=(long)f;//强制转换成long,
String[] args和String arg[] ,在声明“单个变量”时同义,这2句意思相同
但在声明“多个变量”时意思不同:
String[] a,b;//代表声明a,b两个数组
String a[],b//代表声明一个数组,一个对象。
怎么控制精度在java
JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:
转自
Java代码
/*
* Created on 2005-6-5
* Author stephen
* Email zhoujianqiang AT gmail DOT com
* CopyRight(C)2005-2008 , All rights reserved.
*/
package com.soft4j.utility;
import java.math.BigDecimal;
/**
* 与小数位精度(四舍五入等)相关的一些常用工具方法.
*
* float/double的精度取值方式分为以下几种: br
* java.math.BigDecimal.ROUND_UP br
* java.math.BigDecimal.ROUND_DOWN br
* java.math.BigDecimal.ROUND_CEILING br
* java.math.BigDecimal.ROUND_FLOOR br
* java.math.BigDecimal.ROUND_HALF_UPbr
* java.math.BigDecimal.ROUND_HALF_DOWN br
* java.math.BigDecimal.ROUND_HALF_EVEN br
*
* @author stephen
* @version 1.0.0
*/
public final class RoundTool {
/**
* 对double数据进行取精度.
* p
* For example: br
* double value = 100.345678; br
* double ret = round(value,4,BigDecimal.ROUND_HALF_UP); br
* ret为100.3457 br
*
* @param value
* double数据.
* @param scale
* 精度位数(保留的小数位数).
* @param roundingMode
* 精度取值方式.
* @return 精度计算后的数据.
*/
public static double round(double value, int scale, int roundingMode) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double d = bd.doubleValue();
bd = null;
return d;
}
/**
* 测试用的main方法.
*
* @param argc
* 运行参数.
*/
public static void main(String[] argc) {
//下面都以保留2位小数为例
//ROUND_UP
//只要第2位后面存在大于0的小数,则第2位就+1
System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35
System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35
//ROUND_DOWN
//与ROUND_UP相反
//直接舍弃第2位后面的所有小数
System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34
System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34
//ROUND_CEILING
//如果数字0 则和ROUND_UP作用一样
//如果数字0 则和ROUND_DOWN作用一样
System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35
System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34
//ROUND_FLOOR
//如果数字0 则和ROUND_DOWN作用一样
//如果数字0 则和ROUND_UP作用一样
System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34
System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35
//ROUND_HALF_UP [这种方法最常用]
//如果第3位数字=5,则第2位数字+1
//备注:只看第3位数字的值,不会考虑第3位之后的小数的
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34
//ROUND_HALF_DOWN
//如果第3位数字=5,则做ROUND_UP
//如果第3位数字5,则做ROUND_DOWN
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34
//ROUND_HALF_EVEN
//如果第3位是偶数,则做ROUND_HALF_DOWN
//如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
}
}
如果要求精确控制位数,推荐使用BigDecimal,这是在JDK1.4版本之后推荐的一个处理精度的类。
java精度计算的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java计算精度问题、java精度计算的信息别忘了在本站进行查找喔。
发布于:2022-12-29,除非注明,否则均为
原创文章,转载请注明出处。