Java 删除浮点数的尾随数字

Java 删除浮点数的尾随数字,java,floating-point,rounding,Java,Floating Point,Rounding,我的java程序中有一些浮点变量: float var1=1.23456f; float var2=2.34567f; 在我的计算中,浮点变量小数点后的位数会增加或减少,以保持精度。例如,经过一些计算之后 System.out.println(var1); 可打印: 6.35 或 或 我想将这些值四舍五入到小数点后的3位,并删除后面的小数位数,以便对float进行四舍五入,如下所示: 6.350 9.450 88.252 据我所知,NumberFormat和String.forma

我的java程序中有一些浮点变量:

float var1=1.23456f;
float var2=2.34567f;
在我的计算中,浮点变量小数点后的位数会增加或减少,以保持精度。例如,经过一些计算之后 System.out.println(var1); 可打印:

6.35

我想将这些值四舍五入到小数点后的3位,并删除后面的小数位数,以便对float进行四舍五入,如下所示:

6.350   9.450   88.252
据我所知,NumberFormat和String.format()以格式化字符串的形式返回输出。如何将输出作为四舍五入浮点值,以便在计算中进一步使用它?
我可以对我的float(float)变量(实例)应用一个规则来始终舍入/删除小数点后3位的尾随数字吗?

一个(不是很有效)的方法是仍然使用
NumberFormat
类返回
字符串
(有3位),然后使用
float.parseFloat()
将其变回浮点数。

使用简单的辅助方法在任意位置上取整:

 public static void main(String[] args) throws IOException {
    float fl = 1.2345f;
    System.out.println(round(fl, 3));
}

public static float round(float source, int positions) {
    long multiplier = (long) Math.pow(10, positions);
    return return ((float)((int) (source * multiplier)) / multiplier);
}
请注意,这段代码只演示了这个想法,由于长溢出,它被限制在18个位置。

不,你不能得到“四舍五入的浮点值”。
浮点值不存储十进制数。如果要使用特定数量的十进制数字进行计算,请使用
BigDecimal


其他答案都无法满足您的实际需求。

您无法表达
浮点数
的每一个数字,甚至
双精度
。在这种情况下,你会让程序做什么?找到最接近3dp的数字?这会导致巨大的舍入误差…不,你不能得到一个“舍入的浮点”。一个<代码>浮点< /代码>不存储十进制数。如果十进制数字的数量对代码非常重要,请考虑使用BigDigMall而不是浮点。或者使用int或long表示千分之一的数字。如果您试图使用固定(或半固定:有时固定,但偶尔更改)的浮点小数位数实现算术,请不要这样做。对于固定位数,请使用定点算法。(名称是一个关于它适用于什么的巨大线索。)如果您试图以某种方式跟踪精度,那么让浮点数浮动(同样,名称是一个线索)并分别跟踪精度(或提前计算其界限)。这不起作用,因为并非所有数都可以表示为
float
@BoristheSpider是,但他的问题特别提到了浮动,所以对他的情况来说,这是可行的。不,这是行不通的。浮点数没有小数位数;它们只有二进制数字。例如,88.2519989013671875完全可以表示为浮点。88.252不是。我需要一些快速、更少的函数调用。JIT编译器会为您进行方法内联,所以一个方法调用在Java中没有区别。Math.pow和Math.floor()呢?同样的事情。现实世界中的Java应用程序因数据库访问速度、网络延迟、线程迁移和其他复杂因素而导致性能困难。因此,Math.pow()引起的延迟对于性能来说并没有什么实际意义。此外,由于许多原因,过早优化(尤其是低水平优化)被认为是有害的。但无论如何,可以在不使用Math.floor(请参阅更新的代码)的情况下重写代码段,如果您有固定的精度要求,则可以删除Math.pow()。对于三位数字,简单的是‘长乘数=1000;’
6.350   9.450   88.252
 public static void main(String[] args) throws IOException {
    float fl = 1.2345f;
    System.out.println(round(fl, 3));
}

public static float round(float source, int positions) {
    long multiplier = (long) Math.pow(10, positions);
    return return ((float)((int) (source * multiplier)) / multiplier);
}