java float问题

本文探讨了在Java中使用float和double进行运算时的精度问题,通过两个具体例子展示了运算结果的微妙差异,并解释了这种现象背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

public static void main(String[] args) {
int a = (int) ((1000.0 * 60 + 2000.0) * 1.4f);
System.out.println(a);
}


输出   86799

然后这样的话

public static void main(String[] args) {
int a = (int) ((1000.0 * 60 + 2000.0) * 1.4);
System.out.println(a);
}


输出    86800

86800才是正确的,float和double运算时,会将float转换成double,float占4个字节,double占8个字节,所以转换成double时要补位,就会出现这种结果.丢精度了不能乱用啊!!!!!

### 关于 Java 中 `float` 数据类型的使用说明 #### 定义与特点 `float` 是一种单精度浮点数类型,在 Java 的基本数据类型中占据 4 字节的空间[^3]。它能够表示范围较大的实数,但其精确度有限,通常用于不需要高精度计算的场景。 #### 范围与精度 `float` 类型可以存储大约 \( \pm 3.4 \times 10^{38} \) 范围内的值,具有约 7 位有效数字的精度。由于其较低的精度,不适合金融计算或其他需要高度准确性的情况。 #### 默认初始化 当声明一个未赋初值的局部变量时,编译器会报错;但如果是在类成员范围内,则默认初始值为 `0.0f`[^2]。 #### 声明与赋值 在声明 `float` 变量时,需在其后附加字母 `F` 或者 `f` 来表明这是一个 `float` 数字而非默认的双精度 (`double`) 数字。例如: ```java float myFloat = 3.14f; // 正确的方式 // float myFloat = 3.14; // 错误方式, 需要指定 f/F 后缀 ``` #### 整型到浮点型自动转换 所有整型类型(如 `int`, `long`, `byte`, `short` 和 `char`)可以直接赋值给 `float` 类型而无需显式的强制类型转换。下面是一个例子展示这种隐式转型的过程: ```java int intValue = 10; float floatValue = intValue; // 自动转换发生在这里 System.out.println(floatValue); // 输出结果为 10.0 ``` #### 浮点运算注意事项 执行涉及 `float` 的算术操作可能会引入舍入误差,这是因为某些十进制分数无法被准确表达成二进制形式。因此,在比较两个 `float` 值是否相等之前应该考虑一定的容忍度[^1]。 ```java public class FloatComparison { public static void main(String[] args){ float a = 0.1f + 0.2f; System.out.println(a == 0.3f); // 很可能打印 false } } ``` #### 类型转换 如果希望将更宽泛的数据类型比如 `double` 转换成较窄的 `float` ,则必须采用强制类型转换方法,并且要注意这可能导致信息丢失或者不准确的结果。 ```java double doubleVal = 123.456d; float floatVal = (float) doubleVal; // 强制转换 System.out.println(floatVal); // 结果可能是近似值而不是确切原值 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值