• java 浮点数转整数精度处理
2021-02-26 08:33:15

System.out.println("------case1------");

BigDecimal bigDecimal = new BigDecimal(37.98);

System.out.println(bigDecimal);

System.out.println(bigDecimal.intValue());

System.out.println("------case2------");

int totalAmount = (int) (37.98 * 100);

System.out.println(totalAmount);

System.out.println("------case3------");

totalAmount = new BigDecimal(37.98 * 100).intValue();

System.out.println(totalAmount);

System.out.println("------case4------");

System.out.println(bigDecimal.movePointRight(2));

System.out.println(bigDecimal.movePointRight(2).intValue());

System.out.println("------case5------");

System.out.println(new BigDecimal(37).intValueExact()); //没有异常，没有小数点被截取

//System.out.println(bigDecimal.intValueExact()); //存在异常，小数点精度丢失

System.out.println("------case6------");

System.out.println(bigDecimal.multiply(new BigDecimal(100)));

System.out.println(bigDecimal.multiply(new BigDecimal(100)).intValue());

//正确处理

System.out.println("------case7------");

System.out.println(new BigDecimal(37.9899).setScale(2, BigDecimal.ROUND_HALF_UP)); //保留两位小数，后面小数上取整

System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());

System.out.println(Math.ceil(37.98 * 100)); //37.98 * 100 = 3797.9999999999995

System.out.println((int) Math.ceil(37.98 * 100));

------case1------

37.97999999999999687361196265555918216705322265625

37

------case2------

3797

------case3------

3797

------case4------

3797.999999999999687361196265555918216705322265625

3797

------case5------

37

------case6------

3797.99999999999968736119626555591821670532226562500

3797

------case7------

37.99

3798

3797.9999999999995

3798.0

3798

更多相关内容
• int a = 1; int b = 2; float f = (a + b)/2; System.out.println(f); //结果是1.0 上面这段代码的第三行先计算了a+b/2,因为a和b都是int型，int型除法会自动向下取整，所以答案是3//2 = 1。...上面这段代码的第三行先...
int a = 1;
int b = 2;
float f = (a + b)/2;
System.out.println(f); //结果是1.0


上面这段代码的第三行先计算了a+b/2,因为ab都是int型，int型除法会自动向下取整，所以答案是3//2 = 1

int a = 1;
int b = 2;
float f = ((float) a + (float)b)/2;
System.out.println(f); //结果是1.5


上面这段代码的第三行先将ab强转成float型，float型除法会计算3/2 = 1.5

int a = 1;
float b = 2;
float f = (a + b)/2;
System.out.println(f); //结果是1.5


上面这段代码的第三行是float和int相加，int会隐式转为float，所以还是执行的float的加法和除法，所以结果也是1.5

展开全文
• 如果感觉麻烦，可以写一个基本运算的工具类，参考博客 说明： java整数默认是int，小数默认是double类型。（如要得到float类型，则加f如：12.1f） int：4字节，long：8字节，float：4字节，double：8字节 float...

-5的IEEE 754表示.

11000000101000000000000000000000

-1*2^(129-127)*(2^0+2^-2) 红色的部分对应附加位

一个IEEE754在线小工具： http://www.h-schmidt.net/FloatConverter/IEEE754.html

打印float的IEEE754表示的二进制串

public classFloatString {public static voidmain(String[] args){float f = 100.2f;int intString =Float.floatToIntBits(f);if(intString!=0x7f800000||intString!=0xff800000||intString!=0x7fc00000)

{for(int i =0;i<32;i++)

{int t =( intString & (0x80000000>>>i) ) >>> (31-i);

System.out.print(t);

}

}

}

}

Java 的进制间转换.

十进制转成十六进制：Integer.toHexString(int i)

十进制转成八进制：Integer.toOctalString(int i)

十进制转成二进制：Integer.toBinaryString(int i)

十进制转成别的进制的通用方法：Integer.toString(1, 8);

十六进制转成十进制：Integer.valueOf("FFFF",16).toString()

八进制转成十进制：Integer.valueOf("876",8).toString()

二进制转十进制：Integer.valueOf("0101",2).toString()

Float 到double的转换错误例子:

问题1：double类型转float类型没有出错，float转double类型出错。

float f =

121.1f;

double d =

f;

System.out.println(d);

输出：

121.0999984741211

解决办法1：

float

f = 121.1f;

double d ;

BigDecimal bd = new

BigDecimal(String.valueOf(f));

d =

bd.doubleValue();

System.out.println(d);

输出：

121.1

问题2：

double

d =

(3.3-2.1)/0.1;

System.out.println(d);

输出：

11.999999999999996

解决办法2：

BigDecimal b = new BigDecimal("3.3").subtract(new BigDecimal("2.1")).divide(new BigDecimal("0.1"));

System.out.println(b.doubleValue());

小数运算时，或可能会产生小数的运算时，都转换成BigDecimal后再进行，得到结果后再转换成相应类型。

如果感觉麻烦，可以写一个基本运算的工具类，参考博客

说明：

java中整数默认是int，小数默认是double类型。(如要得到float类型，则加f如：12.1f)

int：4字节，long：8字节，float：4字节，double：8字节

float类型的变量只有7位的精度，而double类型的变量有15位的精度。

java在运算时会自动的提升变量的精度来进行运算。(double比float精度更高，所以可以自动的从float转化至double再进行运算。)

BigDecimal介绍：

float和double只能用来做科学计算或者是工程计算，在商业计算中我们要用java.math.BigDecimal.

BigDecimal(double val)Translates a double

into a BigDecimal.这个方法会丢失精度.下面是该API中的说明.

Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.

The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.

BigDecimal(String val)Translates the String

repre sentation of a BigDecimal into a BigDecimal. 这个方法不会丢失精度.

做浮点数运算的工具类

importjava.math.BigDecimal;/*** 由于Java的简单类型不能够精确的对浮点数进行运算，这个工具类提供精

* 确的浮点数运算，包括加减乘除和四舍五入。*/

public classArith{//默认除法运算精度

private static final int DEF_DIV_SCALE = 10;//这个类不能实例化

privateArith(){

}/*** 提供精确的加法运算。

*@paramv1 被加数

*@paramv2 加数

*@return两个参数的和*/

BigDecimal b1= newBigDecimal(Double.toString(v1));

}/*** 提供精确的减法运算。

*@paramv1 被减数

*@paramv2 减数

*@return两个参数的差*/

public static double sub(double v1,doublev2){

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.suBTract(b2).doubleValue();

}/*** 提供精确的乘法运算。

*@paramv1 被乘数

*@paramv2 乘数

*@return两个参数的积*/

public static double mul(double v1,doublev2){

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.multiply(b2).doubleValue();

}/*** 提供(相对)精确的除法运算，当发生除不尽的情况时，精确到

* 小数点以后10位，以后的数字四舍五入。

*@paramv1 被除数

*@paramv2 除数

*@return两个参数的商*/

public static double div(double v1,doublev2){returndiv(v1,v2,DEF_DIV_SCALE);

}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时，由scale参数指

* 定精度，以后的数字四舍五入。

*@paramv1 被除数

*@paramv2 除数

*@paramscale 表示表示需要精确到小数点以后几位。

*@return两个参数的商*/

public static double div(double v1,double v2,intscale){if(scale<0){throw newIllegalArgumentException("The scale must be a positive integer or zero");

}

BigDecimal b1= newBigDecimal(Double.toString(v1));

BigDecimal b2= newBigDecimal(Double.toString(v2));returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

}/*** 提供精确的小数位四舍五入处理。

*@paramv 需要四舍五入的数字

*@paramscale 小数点后保留几位

*@return四舍五入后的结果*/

public static double round(double v,intscale){if(scale<0){throw newIllegalArgumentException("The scale must be a positive integer or zero");

}

BigDecimal b= newBigDecimal(Double.toString(v));

BigDecimal one= new BigDecimal("1");returnb.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

}

};

参考：http://blog.chinaunix.net/uid-26434689-id-3554399.html

展开全文
• 网上搜索了一下，发现有很多人在搜索这个转换的。但没有一个有互换功能，所以就自己手动写了一个，拿给有需要的人；IEEE754浮点数转整数；整数转浮点数的源码，
• [Java教程]javascript浮点数转换成整数三种方法0 2014-06-24 04:00:27将浮点数转换成整数方法有很多，分享三种常用方法。Summary暂时我就想到3个方法而已。如果读者想到其他好用方法，也可以交流一下parseInt位...

[Java教程]javascript浮点数转换成整数三种方法

0 2014-06-24 04:00:27

将浮点数转换成整数方法有很多，分享三种常用方法。

Summary

暂时我就想到3个方法而已。如果读者想到其他好用方法，也可以交流一下

parseInt

位运算符

Math.floor Math.ceil

Description

一、parseInt

1. 实例parseInt("13nash");//13parseInt("")// NaNparseInt("0xA") //10(十六进制)parseInt(" 13")//13parseInt("070")//ES3为56(八进制) ES5为70parseInt(070)//ES3和ES5都为56parseInt(22.5)//22

2. 转换规则：

(1). 根据实例(1)得出parseInt会解析一直到非数字时停止

(2). 根据实例(2)得出parseInt解析空字符串时为NaN，而不是0

(3). 根据实例(3)得出parseInt可以将16进制数转换成10进制

(4). 根据实例(4)得出parseInt忽略字符串的空格

3. 缺点：

(1). 根据实例(5)我们可以知道parseInt在转换八进制数组时是不兼容的。ES3会把070看成八进制数值，但是ES5会将070看成十进制。

(2). 根据实例(6)(7)我们可以知道parseInt在执行的时候会先把参数转变成字符串后再执行变成整数

4. 解释：为什么(5)(6)执行都是执行将070转换成整数，但是结果不一样呢？这个也是解决怎么得到缺点中的第二点。

因为在看官方文档中我看到了If string is not a string, then it is converted to one。这段话。就是说参数如果不是字符串的话，它会先将它转换成字符串再转换成整数。比如实例(6)中parseInt(070)，其实是先将070转换成字符串，(www.jbxue.com)你可以试下070+""或者String(070)都可以知道070会被转换成"56"，因为070是一个八进制。然后就变成了parseInt("56")，最后得出来的整数就是56了。不管在ES3或者ES5都是为56

二、位操作符

1. 实例console.log(0 | "123.45")//123console.log(0 | 123.45)//123console.log(0 ^ 123.45)//123console.log(~~123.45)//123

2. 原理：javascript没有整数的概念，所有的数值型都是双精度浮点数。在用位运算符时，它会先把操作数转变成整数，方便操作。而0与其他值异或或者按位或都不会改变操作值的

三、Math.floor与Math.ceil

1. 实例console.log(Math.floor(2.3)//2console.log(Math.floor(-2.3)//-3console.log(Math.ceil(2.3)//3console.log(Math.ceil(-2.3)//-2

2. 两者不足：Math.floor得到的是数字的最小整数；而Math.ceil得到的是最大整数。所以导致本来-2.3我们取整的话我们要得到的是-2，但是用Math.floor得到的是-3。而2.3用Math.ceil得到的是3，但是我们要的是2就行了。

3. 解决：//自行定义一个函数function getInt(val){return val>0 ? Math.floor(val):Math.ceil(val);}

本文网址：http://www.shaoqun.com/a/94659.html

JavaScript

0

展开全文
• 我们在写程序时，总是会自觉或不自觉地频繁用到类型转换，比如将整数转换为浮点数或反之。今天的题目主要讨论基本类型的转换(但和普通的类型转换有所不同哦，详见后文)，考考你是否真的理解了类型转换的本质。在面向...
• 可以看到是不会报错的，这是因为Java支持数据类型的转换。那如果将一个long类型的数据赋值给int类型的数据，又会怎么样呢？可以看到，现在是报错了的。可以思考一下，long类型的精度是比int类型的要高的，一个低精度...
• 用scanner输入 package wyy; import java.util.*; import java.io.*; public class Hello { public static void main... System.out.print("请输入一个浮点数："); m=reader.nextFloat(); System.out.prin.
• var intvalue = Math.floor( floatvalue );var intvalue = Math.ceil( floatvalue );var intvalue = Math.round( floatvalue );// Math.trunc was added in ECMAScript 6var intvalue = Math.trunc( floatvalue );...
• import java.util.Scanner; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); float a = in.nextFloat(); System.out.println(a-(int...
• import java.util.*; public class app_3 { public static void main(String[] args) { double s1; int s2; Scanner reader=new Scanner(System.in); System.out.print("请输入一个...
• 今天小编就为大家分享一篇Java判断字符串是否是整数或者浮点数的方法，具有很好的参考价值，希望对大家有所帮助。一起跟随小编过来看看吧
• Java浮点数的精确计算及四舍五入的设置四舍五入的设置(1)、浮点数精确计算项目中一直存在一个问题，就是每次报表统计的物资金额和实际的金额要差那么几分钱，和实际金额不一致，让客户觉得总是不那么舒服，原因是...
• public static void main(String[] args){ Scanner sc=new Scanner(System.in); double a=sc.nextDouble();... System.out.println("整数部分是："+(int)a); System.out.print("小数部分是："+a%1); ...
• Java中如何对浮点数进行求余？其实很简单：
• 将开发过程经常用到的代码片段记录起来，下面代码段是关于 Java浮点数按照整数和小数进行拆分的代码，应该是对各朋友有较大用处。public class helloworld { public static void main(String[] args) { String...
• 从键盘读取一个浮点数后，程序判断该浮点数由多少位数字，并分别输出整数部分、小数部分以及整数部分共有多少位数字、小数部分共有多少位数字。 注意：若输入abc，对异常进行处理。 题解 import java.util....
• import java.util.*; public class APP49 { public static void main(String[] args) { float a; System.out.print("请输入一个浮点数："); Scanner reader=new Scanner(System.in); a=r...
• class java3_2 { public static void main(String[] args) { int a=155,b=9; float g,h; System.out.println("a="+a+",b="+b); g=a/b; System.out.println("a/b="+g+"\n"); System.out.println("a="+a+"，b=...
• 大数乘法可以进行任意大小和精度的整数浮点数的乘法运算, 精确度很高, 可以用作经融等领域的计算.这个是我看了一些资料, 然后自己整理实现的. 简单测试了一下.import java.io.BufferedReader;import java.io....
• 主要介绍了java.math包下计算浮点数整数的类的实例代码，本文通过使用BigDecimal进行浮点数比较给大家介绍的非常详细，具有一定的参考借鉴价值,需要的朋友可以参考下
• 在我的计算机科学课程中，我们正在研究浮点数及其在内存中的表示方式...当将无法精确表示的浮点数加到自身上时，答案要比我们在数学上期望的要低，但是当同一浮点数乘以整数后，答案就精确地得出了正确的数字。这是...
• Java中如果除运算符“/”，在不加任何限制的情况下，两个整数相除，得到的是整数，小数点后的被舍弃。但是有些场景下我们需要拿到除得的小数，还要指定位数的小数。这时候有以下处理方法： 1.使用DecimalFormat来...
• Java输入浮点数分别输出整数部分和小数部分
• how do floating point numbers round when they are made in java?当您使用构造(int)d时,Java...如果需要舍入到最接近的整数,可以使用下面的行：int a = (int) Math.round(d);the classic example is 0.1 what is o...
• Summary 暂时我就想到3个方法而已。如果读者想到其他好用方法，也可以交流一下 parseInt 位运算符 Math.floor Math.ceil Description 一、parseInt 1. 实例 parseInt("13nash");...parseInt("0xA") //10(十六进制) ...

...

java 订阅