保留尾随零的情况下舍入双精度数。

12

这是我用来将数字四舍五入到两位小数的函数,但当四舍五入后的数字为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。


4
1.5和1.50在double中没有不同的表示方式,它们在数值上是相同的,因此它们只有一个共同的double表示。 - Dawood ibn Kareem
也许你的方法应该返回 String,而不是 double,这样你就可以对它进行任何类型的格式化。 - Dawood ibn Kareem
你确定要用 20 吗?也许我误解了你的意图,但是你对于 1.489 的方法不会返回 1.49。我认为你应该将精度设置为 100 以保留两位小数。 - cyon
@cyon,它应该将其四舍五入到下一个1/20的倍数,因此1.499确实会变成1.5。但你说得对,它与“最多两位小数”这一评论不符。 - paxdiablo
4个回答

24

这是一个打印问题:

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

明白了。谢谢,这很有帮助。 - Nick Div
如果结果格式是您的本地格式并且您想要更改它,请使用此链接:https://dev59.com/Sm445IYBdhLWcg3wZJYn#4885329 - Théophile Wallez

4

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作为accuracy的值。


感谢您详细的解释。 - Nick Div
在你最后的代码片段中,你有两个不同的变量名叫做 acc(一个是参数,一个是局部变量),还有两个不同的变量名叫做 fmt。然后你使用了一个名为 accuracy 的变量,但它似乎并不存在。你可能需要修复这个问题。 - Dawood ibn Kareem
@David,该死的复制粘贴错误 :-) 谢谢你指出,现在已经修复了。 - paxdiablo
抱歉,我真的应该自己编辑它。从字面上看,你的意思是那两个变量应该是局部变量,而不是参数。 - Dawood ibn Kareem

2
您需要将其格式化为字符串以此来实现。Java和大多数编程语言一样,会舍去尾部的零。
String.format("%.2f", number);

所以你可以返回一个字符串(将返回类型从double改为String),或者只在需要显示时使用上面的代码进行格式化。你可以阅读Formatter的JavaDoc,以了解有关小数位数、逗号放置等所有可能性。

谢谢,Jean的解决方案与你的一样,运行顺畅。 - Nick Div
只有一个小问题,虽然它不会影响输出:你格式化字符串中的 1 对整个内容的最小字段宽度影响很小。由于你还指定了它的形式为 .99,所以它必须比这更大。 - paxdiablo
感谢@paxdiablo。我最初将其格式化为逗号分隔符(这是我个人使用的方式),然后将其更改为更简单的形式,并匆忙地留下了“1.”。现在已经更正,谢谢! - Todd

1

如果你想的话,可以尝试这个字符串输出

double number = roundOff(1.499);//1.5

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接