Java 四舍五入一个双精度,同时保持尾随零

Java 四舍五入一个双精度,同时保持尾随零,java,math,double,rounding,Java,Math,Double,Rounding,这里是我的函数,将一个数字舍入到两位小数,但当舍入的数字为1.50时,它似乎忽略了尾随的零,只返回1.5 public static double roundOff(double number) { double accuracy = 20; number = number * accuracy; number = Math.ceil(number); number = number / accuracy; retu

这里是我的函数,将一个数字舍入到两位小数,但当舍入的数字为1.50时,它似乎忽略了尾随的零,只返回1.5

public static double roundOff(double number) {
        double accuracy = 20;
        number = number * accuracy;
        number = Math.ceil(number);
        number = number / accuracy;
        return number;
    }

因此,如果我发送1.499,它将返回1.5,如果我希望返回1.50,则必须将其格式化为
字符串才能执行此操作。与大多数语言一样,Java将删除尾随的零

String.format("%.2f", number);

因此,您可以返回
字符串
(将返回类型从double更改为double),或者在需要使用上面的代码显示时仅对其进行格式化。为了了解小数位数、逗号位置等的所有可能性,您可以使用以下选项。

这是一个打印问题:

double d = 1.5;
System.out.println(String.format("%.2f", d)); // 1.50

1.5
是有效位数,尽管如此,与
1.50
相同(甚至
1.5000000000000

您需要将数字的值与其表示形式分开

如果希望输出两位十进制数字,只需使用
String.format
,例如:

public class Test
{
    public static void main(String[] args) {
        double d = 1.50000;
        System.out.println(d);
        System.out.println(String.format("%.2f", d));
    }
}
哪些产出:

1.5
1.50
如果您仍然需要一个能为您完成所有这些并提供特定格式的函数,则需要使用以下内容返回字符串:

public static String roundOff(double num, double acc, String fmt) {
    num *= acc;
    num = Math.ceil(num);
    num /= acc;
    return String.format(fmt, num);
}
并称之为:

resultString = roundOff(value, 20, "%.2f"); // or 100, see below.
这将允许您以任何您想要的方式定制精度和输出格式,尽管您仍然可以硬编码值,如果您想要简单:

public static String roundOff(double num) {
    double acc = 20;
    String fmt = "%.2f";
    num *= acc;
    num = Math.ceil(num);
    num /= acc;
    return String.format(fmt, num);
}


最后一个注意事项:您的问题表明您希望四舍五入到“两位小数”,但这与您使用
20
作为精度不太相符,因为这将四舍五入到
1/20
的下一个倍数。如果您真的希望将其四舍五入到两位小数,则用于
精度的值应为
100

如果您希望是字符串输出,可以尝试此方法

double number = roundOff(1.499);//1.5

DecimalFormat decimalFormat = new DecimalFormat("#.00");
String fromattedDouble = decimalFormat.format(number);//1.50

函数舍入与您在问题中提到的相同。

1.5和1.50没有单独的
双精度。它们在数字上是相同的,所以它们只有一个
double
表示。也许您的方法应该返回
String
,而不是
double
,这样您就可以使用它执行任何类型的格式化。您确定
20
?也许我误解了你的意图,但是你的
1.489
方法不会返回
1.49
。我认为您应该将精度设置为
100
,小数点后两位。@cyon,它应该将其四舍五入到下一个1/20的倍数,因此1.499实际上将变为1.5。但你是对的,它并没有用“最多两个小数”来表示,明白了。谢谢这很有帮助。谢谢,Jean的解决方案与您的解决方案一样工作顺利。只需注意一点,尽管它不会影响输出:您的格式字符串中的
1
在这里几乎没有效果,因为它设置了整个内容的最小字段宽度。由于您还指定它的格式为
.99
,因此它已经超过了该格式。谢谢@paxdiablo。我把它当作不同的东西(用我个人使用的逗号分隔符格式化),然后把它改得更简单,在匆忙中把“1.”留在了表中。现在更正,谢谢!感谢您的详细解释。在您的最后一个小片段中,您有两个不同的变量名为
acc
(一个参数,一个本地变量)和两个不同的变量名为
fmt
。然后使用一个名为
accurity
的变量,该变量似乎不存在。您可能想修复此问题。@David,该死的剪切粘贴错误:-)谢谢,现在已修复。对不起,我真的应该自己编辑它。很明显,你的意思是这两个变量是局部变量,而不是参数。