Java 四舍五入一个双精度,同时保持尾随零
这里是我的函数,将一个数字舍入到两位小数,但当舍入的数字为1.50时,它似乎忽略了尾随的零,只返回1.5Java 四舍五入一个双精度,同时保持尾随零,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
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,该死的剪切粘贴错误:-)谢谢,现在已修复。对不起,我真的应该自己编辑它。很明显,你的意思是这两个变量是局部变量,而不是参数。