【问题标题】:Java random generate price in two decimal format [duplicate]Java随机生成两位十进制格式的价格[重复]
【发布时间】:2017-07-24 03:22:01
【问题描述】:

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

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 等值。是否有格式化它的方法?

【问题讨论】:

  • 不行不行。我仍然看到一些值,例如 .03、.07 等
  • 如果您希望所有随机值都是 0.10 的倍数,则生成一个随机整数并将其乘以 0.10(或除以 10)。查看Random 类,了解生成随机整数的方法。

标签: java random format decimalformat


【解决方案1】:

正如我在 cmets 中所说,这很容易实现,方法是将 randomValue 结果乘以 10,然后对其应用 Math.floor(),最后除以上一步中获得的结果即可。

注意:(在 cmets 部分,我的手指最后输入了一个额外的 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));

【讨论】:

  • 但这给了我一个小数点,即使我将 DecimalFormat 添加为 #.##
  • 是的,我做到了,但不知何故,它仍然给了我一个小数点。有什么想法吗?
  • @DeniseTan - 我希望我的回答有帮助,而且是最简单的。应用 DecimalFormat("#0.00") 时需要使用正确的模式,请检查。
  • 非常感谢!它有效!!!
【解决方案2】:

我有另一个简单的解决方案,也许它是最简单的?这样想:0.00, 0.10, 0.20 ... 2.10,其实只需要生成从0(含)到22(不含)的随机整数,然后除以10,然后就可以用结果来格式化.

比如你得到的随机数是18,那么结果是1.8,那么你可以格式化为1.80;

Random rand = new Random();
System.out.printf("%.2f%n", rand.nextInt(22) / 10.0);

同样的逻辑,如果你想得到最小跳空0.01的价格,你可以生成0(含)到211(不含)的随机数除以100;

处理 0 无需其他操作。

【讨论】:

  • 在这种情况下无论如何不要使用 printf 吗?因为我将使用 System.out.println 格式化输出
  • @DeniseTan 我可以知道有什么理由这样做吗?因为 printf 中的 %n 用于换行,如 println 中的 ln
  • 您可以使用String.format,它使用与printf 相同类型的格式字符串,但不打印任何内容。见javadoc
  • 是的,正如@ajb 所说,您可以使用 String.format 格式化字符串,并将其与 System.out.println 一起使用
【解决方案3】:

你可以让它生成以 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

【讨论】:

  • 我收到.20....
  • 这就是 OP 想要的。
  • “我想要格式为 0.00, 0.10, 0.20, 0.30, 0.40, 0.50 ....的价格。”
  • @JohnJoe 我编辑了我的帖子。
  • @CodingNinja 嘿,在后面添加“0”有一些问题。我得到一些随机值,例如 20、30 等
【解决方案4】:

抱歉没有仔细阅读。

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

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多