「java精度计算」java计算精度问题

博主:adminadmin 2022-12-29 02:42:10 62

本篇文章给大家谈谈java精度计算,以及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精度计算的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-29,除非注明,否则均为首码项目网原创文章,转载请注明出处。