编辑:这与计算机如何处理浮点运算有关,这是每个程序员一生都要面对的事实。当我问这个问题时,我没有正确理解这一点。
我知道最简单的方法是:
val floatNumber: Float = 123.456f
val decimalPart = floatNumber - floatNumber.toInt() //This would be 0.456 (I don't care about precision as this is not the main objective of my question)
现在,在一支笔和一张纸的现实世界中,如果我想将小数部分0.456“转换”为整数,我只需要乘以0.456*1000,就得到了所需的结果,即456(整数)。
许多建议的解决方案建议将数字拆分为字符串并以这种方式提取小数部分,但我需要从数学上获得解决方案,而不是使用字符串。
给定一个数字,小数位数未知(转换为字符串并在其后计数字符。或者,不可接受),我需要仅使用数学将其小数部分“提取”为整数。
不走运地读这样的问题:
如何获取浮点的小数部分?
如何提取双十进制/大十进制的小数位数
如果有人知道kotlin语言解决方案,那就太好了。为了以防万一,我会把这个问题也发布在数学平台上。在JSP/Java中,如何从double中获取整数和小数部分?
更新:是否有“数学”方法“计算”一个数字有多少个小数?(当您转换为字符串并计算字符时,这很明显,但我需要避免使用字符串)这将是一个很好的计算原因:十进制(0.456)*10*十进制数(3)将产生所需的结果。
更新2这不是我的用例,但我想它会澄清这个想法:假设您想要计算一个常量(例如PI),并且想要返回一个整数,该整数最多包含常量小数部分的50位数字。常数不一定是无限的(例如可以是0.5,在这种情况下将返回“5”)
Float或Double是不精确的,只是近似值,没有精确性。因此,12.345介于12.3449。。。和12.3450。
这意味着12.340不能与12.34分开。“小数部分”将是34除以100。此外,12.01将有一个“小数部分”1除以100,12.1也将有1除以10。
因此,完整的算法是(使用java):
int[] decimalsAndDivider(double x) {
int decimalPart = 0;
int divider = 1;
final double EPS = 0.001;
for (;;) {
double error = x - (int)x;
if (-EPS < error && error < EPS) {
break;
}
x *= 10;
decimalPart = 10 * decimalPart + ((int)(x + EPS) % 10);
divider *= 10;
}
return new int[] { decimalPart, divider };
}
如果您将一些字符串转换器与方法()一起使用,我不确定在这个特定问题上是否对您不利。这是获得正确答案的一种方法。我知道您说过不能使用字符串,但您能在自定义方法中使用字符串吗?这可以精确地为您提供所需的答案。以下是可以帮助我们转换数字的类:
class NumConvert{
String theNum;
public NumConvert(String theNum) {
this.theNum = theNum;
}
public int convert() {
String a = String.valueOf(theNum);
String[] b = a.split("\\.");
String b2 = b[1];
int zeros = b2.length();
String num = "1";
for(int x = 0; x < zeros; x++) {
num += "0";
}
float c = Float.parseFloat(theNum);
int multiply = Integer.parseInt(num);
float answer = c - (int)c;
int integerForm = (int)(answer * multiply);
return integerForm;
}
}
然后在您的主类中:
public class ChapterOneBasics {
public static void main(String[] args) throws java.io.IOException{
NumConvert n = new NumConvert("123.456");
NumConvert q = new NumConvert("123.45600128");
System.out.println(q.convert());
System.out.println(n.convert());
}
}
输出:
45600128
456
我只需将小数乘以10(或将小数点向右移动),直到它没有剩下小数部分:
public static long fractionalDigitsLong(BigDecimal value) {
BigDecimal fractional = value.remainder(BigDecimal.ONE);
long digits;
do {
fractional = fractional.movePointRight(1); // or multiply(BigDecimal.TEN)
digits = fractional.longValue();
} while (fractional.compareTo(BigDecimal.valueOf(digits)) != 0);
return digits;
}
注1:使用BigDecimal避免浮点精度问题
注2:使用比较器进行比较,因为比较器也比较刻度(“0.0”
不等于“0.00”
)
(确保BigDecimal已经知道小数部分的大小,只是size()
返回的值)
补充:
如果使用BigDecimal,整个问题可以压缩为:
public static BigInteger fractionalDigits(BigDecimal value) {
return value.remainder(BigDecimal.ONE).stripTrailingZeros().unscaledValue();
}
如果需要,可以抑制剥离零点
问题内容: 给定,例如1.25-如何获得该数字的“ 1”和“ .25”部分? 我需要检查小数部分是否为.0,.25,.5或.75。 问题答案: 然后与1 / 4、1 / 2、3 / 4等进行比较。 如果是负数,请使用以下方法: 在作出停止其 -1.25 到 -1 和 -0.25
问题内容: 我在表格栏中 我只需要得到那行,列中的值正好是10个符号,所有这些符号都只是数字 为此必须编写什么查询? 我在尝试 但这不会返回0行 问题答案: 您正在寻找的模式是或。 一切都在手册中。
问题内容: 是否存在将数字分割成两个部分(即整数部分和小数部分)的有效方法? 问题答案: 用途:
问题内容: 在Java中,我正在使用该类,并且代码的一部分要求我从其中提取小数部分。 似乎没有任何内置方法可以帮助我获取a的小数点后的数字。 例如: 我想从上面表示的数字中提取。最好的方法是什么? 问题答案: 我会尝试的。 使用方法和常量。
问题内容: 我有一本字典,其中包含用枚举值散列的对象: 我希望能够提取此字典包含的所有颜色(值)的数组。我以为我可以使用该属性,就像遍历字典值()一样,但这会返回错误: 似乎该方法返回了一个更抽象的集合类型,而不是返回值的an 。有没有一种方法可以获取包含字典值的而不循环提取它们的值? 问题答案: 从Swift 2.0开始,的属性现在返回而不是。该类型知道如何使用此抽象集合类型进行初始化: Swi
问题内容: 我有1100、1002、1022等数字。我想使用单个数字,例如,对于第一个数字1100,我希望具有1、1、0、0。 如何用Java获取它? 问题答案: 为此,你将使用(mod)运算符。 mod运算符将为你提供对int进行除法运算的其余部分。 所以, 因为: 注意:如Paul所述,这将为你提供相反的数字。你将需要将它们压入堆栈并以相反的顺序弹出。 代码以正确的顺序打印数字: