Java 双倍转字符串

Java Double to String

在 java 中,我想要一种方法,当用户输入双数货币值(例如 317.93)时,程序应显示如下数字: 1---200 1---100 0---50 0---20 1---10 1---5 2---1 1---0.5 1---0.25 1---0.1 1---0.05 3---0.001(第一个数字有多少张第二个数字是多少张纸币)

Scanner input = new Scanner(System.in);
double o = input.nextDouble();
int a =(int)o;
int m=a;
int x=a/200;
a=a-(a/200*200);
int y=a/100;
a=a-(a/100*100);
int z=a/50;
a=a-(a/50*50);
int w=a/20;
a=a-(a/20*20);
int q=a/10;
a=a-(a/10*10);
int d=a/5;
a=a-(a/5*5);
int c=a/1;
double k=o-(double)m;//for getting fraction part
double n=k/0.5;
k=k-0.5;
double e=k/0.25;
k=k-(0.25);
double l=k/0.10;
k=k-((int)l*0.1); //ıwas going to continue but here number becomes 0.99999964 instead of 0.1

System.out.println(x+" - "+"200");
System.out.println(y+" - "+"100");
System.out.println(z+" - "+"50");
System.out.println(w+" - "+"20");
System.out.println(q+" - "+"10");
System.out.println(d+" - "+"5");
System.out.println(c+" - "+"1");
System.out.println((int)n+" - "+"0.5");
System.out.println((int)e+" - "+"0.25");
System.out.println((int)l+" - "+"0.10");

我写了这篇文章,但是当数字涉及小数部分时,0.1 变成了 0.999999,所以我得到的结果我不想 to.Also 这种方法太久了)

知道如何更正此方法或其他方法吗?提前致谢。

双打的问题在于它们进行无声舍入。 double 可以表示的数字略少于 2^64 个。鉴于 double 涵盖了从 -infinity 到 +infinity 的所有内容,并且在 0.000 和 1.000 之间有无限个数字,这应该让你想知道:等等,如果 double 可以表示无穷大,但是 also 适用于 64 位,它是如何工作的?

它 'works' 实际上只表示 2^64 个不同的特定数字。让我们称它们为 'the blessed numbers',您对双打 所做的任何和所有数学运算都会默默地四舍五入到最接近的祝福数字 。没有机会知道这引入了多少错误(怎么可能;那个错误值可能也没有得到祝福!)

结论是:double意味着你已经死在水里了

你不想要它们。

解决方法是:这里有特定的原子单位,每种货币都是这样:没有半美分这样的东西,没有半日元这样的东西,没有半聪这样的东西:所有相关系统(例如银行、比特币区块链等)除了这个原子概念的整个单元之外,根本无法表示任何东西。

所以,使用它。使用 long 表示您拥有的原子数。因此,5 美元半变成 long a = 550; - 即 550 美分。

现在您的整个过程是 ALL 相同的性质:“删除”给定面额的尽可能多的整数单位,打印出来,然后继续下一个较小的面额。而且您永远不必处理舍入错误。

Scanner input = new Scanner(System.in);
double o = input.nextDouble();
long cents =(long) (100.0 * o);

您还显示了 0.001 个单位,因此您的原子量可能不是“每单位 100”,而是例如a 1000。同样的原则也适用。 (如果您的货币每六便士有 120 个 doohickeys,并且金额通常显示为(小数)六便士,则取六便士,乘以 120,然后对 doohickeys 进行所有计算)。

现在,您只想概括代码的第一部分,这是一个很好的编程练习,您应该自己完成。提示:

int[] denominations = [20000, 10000, 2000]; // this currency has bills of 200 dollars, 100 dollars, and 20 dollars).

for (int billSize : denominations) {
  int billCount = cents / billCount;
  cents -= billCount * billSize;
  // now 'billCount' contains how many of that bill you want to pay out.
}