双精度浮点型是否是计算十进制百分比的正确数据类型?

4

我希望在我的项目中计算百分比,我正在使用double。请建议我正确的数据类型以计算十进制的百分比,例如5.368的18%应该给出0.966。

我希望结果截断到三个小数位。

我正在使用以下代码:

EditText kundan = (EditText) findViewById(R.id.kundan);
double kundangiven = Double.parseDouble(kundan.getText().toString());
EditText loss = (EditText)findViewById(R.id.losspercentage);
double lossinkundan = Double.parseDouble(loss.getText().toString());
losspercent  = (lossinkundan * kundangiven) / 100 ;
losspercent = losspercent % 10 ;
displayTotalloss(losspercent);

看看这里,或许会有所帮助。顺便说一句,Double是正确的类型,我个人认为。 - Luca Nicoletti
你的代码到底哪里出了问题? - OneCricketeer
@Rosan 请看下面我编辑过的答案,关于格式化结果的问题。 - Michael Dodd
@Rosankarel 如果您正在寻找一种将非整数数字截断为3位小数的方法,那么应该在问题中更清楚地表达。我进行了一些小修改。希望这样可以。 - Sam Hazleton
@Rosankarel 这行代码是干什么用的?losspercent = losspercent % 10 ; 它的作用就是截取掉个位数左边的所有数字。 - Sam Hazleton
显示剩余2条评论
2个回答

4

您原来的代码在存储百分比计算方面表现良好。关于将结果格式化为3位小数,请使用String.format(),例如:

String.format("%.3f", losspercent);

一个十进制是一个数字。你的意思是小数位数吗? - user207421
它没有给我结果...我认为这是简单的十进制除法,我无法正确编码...我已经给出了例子..18%OF 5.368应该给出0.966。 - Rosan karel
它给出的答案是0.9662400000000001,这仍然正确到小数点后3位。 - Michael Dodd
是的,但有没有办法从2中丢弃其余部分? - Rosan karel
如果您要在TextView中显示结果,可以使用String.format来限制小数位数,例如:String.format("%.3f", losspercent); - Michael Dodd
谢谢 @MichaelDodd,这真的很有帮助,我正在得到我想要的东西...谢谢。 - Rosan karel

2
现在我更好地了解了您的需求,以下是将double转换为3位小数的方法以供显示: String.format("%.3f", losspercent); 这会返回一个String,因此可以从函数中返回,直接传递给显示函数或存储在String类型的变量中。
看起来您正在询问是否使用了正确的数据类型存储计算出的百分比,或者是否有更好的选择。
考虑到您目前的代码结构,我认为是的,double是正确的选择。每当您除(或乘)非整数数字时,输出的精度往往需要比输入的精度更高才能得到准确的结果。在这里使用double而不是float所带来的内存成本可能微不足道,因此double似乎是显而易见的选择。
如果您真的非常关注精度,那么可以使用BigDecimal。但是,BigDecimal不是原始类型,因此它会在内存和处理方面花费更多的成本(尽管在此示例中仍然可能不会注意到)。
当然,如果您真的想使用“正确”的数据类型,并且您控制代码库,则可以创建自己的数据类型。但我认为在这里是不必要的。 double非常适合。如果您关心可读性,可以考虑创建一个函数,该函数接受double xint p,并返回表示xp百分比的double。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接