2017-07-24 38 views
1

我想随机使用Java在0到2.10的范围内生成价格。我希望价格的格式为0.00,0.10,0.20,0.30,0.40,0.50 .... 1.10,1.20一直到2.10。我的代码是这样的:Java随机生成两位十进制格式的价格

private static DecimalFormat df2 = new DecimalFormat(".##"); 
double min = 0; 
double max = 2.10; 
double diff = max - min; 
double randomValue = min + Math.random() * diff; 
System.out.println(df2.format(randomValue)); 

但是,它打印出像.06,1.0,.99,.02等值。有无论如何格式化它?

+0

不行不行。我仍然会看到一些值,例如.03,.07等 – hyperfkcb

+0

如果您希望所有随机值都是0.10的倍数,则生成一个随机整数并将其乘以0.10(或除以10)。查看Random类可以生成随机整数。 – ajb

回答

1

正如我在注释中规定,这是通过乘以10随机值结果,然后在其上施加Math.floor()非常容易地可能的,并且然后最后划分上一步获得的结果将为你做。

注:(!在评论部分,我的手指在最后输入一个额外的0我已删除虽然评论)

工作代码为:

// use the correct pattern #0.00 
DecimalFormat formatter = new DecimalFormat("#0.00"); // edited here.  
double randomValue = min + Math.random() * diff; 
double tempRes = Math.floor(randomValue * 10); 
double finalRes = tempRes/10; 
System.out.println(formatter.format(finalRes)); 
+0

但是,即使我将DecimalFormat添加为#,这也给了我一个小数点。## – hyperfkcb

+0

是的,但是不知怎的,它仍然给我一个小数点。有任何想法吗? – hyperfkcb

+0

@丹尼斯坦 - 我希望我的回答有帮助,而且是最简单的。您需要在应用DecimalFormat(“#0.00”)时使用正确的模式,请检查。 –

1

对不起,请仔细阅读。

private static DecimalFormat df2 = new DecimalFormat("#.#"); 
... 
System.out.println(df2.format(randomValue) + "0"); 
+0

对不起,请仔细阅读。 –

2

你可以把它产生在0喜欢这个结尾的数字:

public static void main(String[] args){ 
    DecimalFormat df2 = new DecimalFormat("0.0"); 
    double min = 0.00; 
    double max = 2.10; 
    double rand = new Random().nextDouble(); 
    String result = df2.format(min + (rand * (max - min))) + "0"; 
    System.out.println(result); 
} 

它只是舍入小数到第十位,然后将0到输出,生成你想要的数字。

以下是输出的一些例子:

1.90 
1.50 
0.70 
2.10 
1.40 
1.10 
0.10 
0.00 
0.60 
+0

我得到'.20' .... –

+0

这就是OP想要的。 – CodingNinja

+0

_“我想要的格式的价格像0.00,0.10,0.20,0.30,0.40,0.50 ....”_ –

2

我有另一个直接的解决方案,也许这是最简单的解决方案?用这种方式考虑一下:0.00,0.10,0.20 ... 2.10,实际上你只需要生成从0(含)到22(不含)的随机整数,然后除以10即可。然后你可以使用结果来格式化。

例如,你有的随机数是18,那么结果是1.8,那么你可以格式化为1.80;同样的逻辑,如果你想要价格的最小差距为0.01,你可以生成从0(包含)到211(不包括)的随机数并除以100;否则,

处理0时不需要其他操作。

+0

反正有没有在这种情况下使用printf?因为我将使用System.out.println – hyperfkcb

+0

@DeniseTan来格式化输出我可能知道是否有任何理由这样做?因为printf中的%n用于换行printn中的ln – Elvin

+0

您可以使用'String.format',它使用与'printf'相同类型的格式字符串,但不打印任何内容。请参阅[javadoc](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...-) – ajb