简体   繁体   English

在保持尾随零的同时舍入双倍

[英]Round off a double while maintaining the trailing zero

Here is my function to roundoff a number upto two decimals but when the rounded off number is 1.50 it seems to ignore the trailing zero and just returns 1.5 这是我的函数来舍入一个最多两位小数的数字但是当舍入数字是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;
    }

So if I send 1.499 it returns 1.5 where as I want 1.50 因此,如果我发送1.499,则返回1.5,因为我想要1.50

This is a printing poblem: 这是一个印刷问题:

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

1.5 is, number of significant digits notwithstanding, the same as 1.50 (and even 1.5000000000000 ). 1.5是尽管有效位数,但 1.50 (甚至1.5000000000000 )相同。

You need to separate the value of the number from its presentation. 您需要将数字的与其显示分开

If you want it output with two decimal digits, just use String.format , such as with: 如果您希望它输出两个十进制数字,只需使用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));
    }
}

which outputs: 哪个输出:

1.5
1.50

If you still want a function that does all that for you and gives you a specific format, you'll need to return the string with something like: 如果您仍然需要一个能够为您完成所有操作为您提供特定格式的函数,则需要返回以下内容:

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

and call it with: 并称之为:

resultString = roundOff(value, 20, "%.2f"); // or 100, see below.

This will allow you to tailor the accuracy and output format in any way you desire, although you can still hard-code the values if you want simplicity: 这将允许您以您想要的任何方式定制精度和输出格式,但如果您想要简单,您仍然可以对值进行硬编码:

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);
}

One final note: your question states that you want to round to "two decimals" but that doesn't quite gel with your use of 20 as the accuracy, since that will round it up to the next multiple of 1 / 20 . 最后一点:你的问题指出,要舍入到“两位小数”,但完全不是那么回事凝胶与您使用的20的准确性,因为这将圆它到的下一个倍数1 / 20 If you really want it rounded up to two decimals, the value you should be using for accuracy is 100 . 如果你真的希望它四舍五入到两位小数,那么你应该用于accuracy的值是100

You will have to format it as a String in order to do that. 您必须将其格式化为String才能执行此操作。 Java, like most languages, will drop the trailing zero. 与大多数语言一样,Java将降低尾随零。

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

So you can either return a String (change your return type from double) or just format it when you need to display it using the code above. 因此,您可以返回一个String (从double更改返回类型),或者只在需要使用上面的代码显示它时格式化它。 You can read the JavaDoc for Formatter in order to understand all of the possibilities with number of decimal places, comma placement, etc. 您可以阅读JavaDoc for Formatter ,以了解小数位数,逗号位置等所有可能性。

You can try this if you want is a String output 如果你想要的是String输出,你可以尝试这个

double number = roundOff(1.499);//1.5

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

The function roundOff is the same as you mentioned in your question. 函数roundOff与您在问题中提到的相同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM