我们如何将浮点数拆分为整数和小数部分?
How can we split a floating point number to its integer and decimal parts?
我想检测数字的浮点数和整数部分,例如 235.102457
。
简而言之,我想存储我号码的两部分,例如:
A=235
B=102457
我该如何拆分这个号码?
假设你想保留 6 位小数,那么你可以这样做:
x = rand * 1000;
dec = 6;
A = round(x);
B = round((x-A)*10^dec);
我认为这可行(仅在 Octave 中测试):
x = 235.102457
A = floor(x)
B = mod(x,1)
x=235.102457;
tmp = strsplit(num2str(x,16),'.'); % Cast to string, split on the dot
A = str2num(tmp{1}); % = 235
B = str2num(tmp{2}); % = 102457
您可以通过使用 num2str()
, splitting on the dot using strsplit()
, then convert each part back to doubles using str2num()
.
将数字转换为字符串来完成此操作
请注意 num2str
调用中的 16
:默认情况下,字符串中只保留 4 位小数。基本上任何足够大的数字都可以,只要你的数字的小数部分小于这个。将它设置得更高可以增加运行时间。
用数字来做到这一点很困难。指定小数位数然后四舍五入,就像其他答案一样,工作,但有缺点,例如1.1, 1.0, 1.100
等同对待。由于数值精度,尝试递归地求幂是行不通的:
x = 235.102457;
A = fix(x);
tmp = x-A;
tmp*10^6
ans =
1.024569999999869e+05 % i.e. needs rounding
kk = 0;
while kk<32 && ~(mod(tmp,1)==0)
tmp = tmp*10;
kk = kk+1;
end
tmp
tmp =
1.024569999999869e+16 % Gets a lot of floating point garbage
在循环中没有办法知道什么时候四舍五入,因此试图递归地找到有效数字的数量,kk
在这种情况下失败(除非以某种方式设法实现的四舍五入魔术四舍五入而不去掉所需的小数位)。
即使是负数也应该有效:
nDecimalDigit = 9 ;
A = fix( x ) ;
B = round( abs(x-A) * 10^nDecimalDigit ) ;
fix()
函数向零舍入,这将 return 数字的相同整数部分,无论它是负数还是正数(不同于 floor
或 ceil
分别向负无穷大和正无穷大舍入)。
由于A
保留了原来输入的符号,我猜你不需要小数部分的符号B
,所以我们用abs()
取消标志。
我们将这个小数乘以一个因数,具体取决于您要保留的位数,然后我们对 trim 数字中剩余的小数部分进行最后四舍五入。
我想检测数字的浮点数和整数部分,例如 235.102457
。
简而言之,我想存储我号码的两部分,例如:
A=235
B=102457
我该如何拆分这个号码?
假设你想保留 6 位小数,那么你可以这样做:
x = rand * 1000;
dec = 6;
A = round(x);
B = round((x-A)*10^dec);
我认为这可行(仅在 Octave 中测试):
x = 235.102457
A = floor(x)
B = mod(x,1)
x=235.102457;
tmp = strsplit(num2str(x,16),'.'); % Cast to string, split on the dot
A = str2num(tmp{1}); % = 235
B = str2num(tmp{2}); % = 102457
您可以通过使用 num2str()
, splitting on the dot using strsplit()
, then convert each part back to doubles using str2num()
.
请注意 num2str
调用中的 16
:默认情况下,字符串中只保留 4 位小数。基本上任何足够大的数字都可以,只要你的数字的小数部分小于这个。将它设置得更高可以增加运行时间。
用数字来做到这一点很困难。指定小数位数然后四舍五入,就像其他答案一样,工作,但有缺点,例如1.1, 1.0, 1.100
等同对待。由于数值精度,尝试递归地求幂是行不通的:
x = 235.102457;
A = fix(x);
tmp = x-A;
tmp*10^6
ans =
1.024569999999869e+05 % i.e. needs rounding
kk = 0;
while kk<32 && ~(mod(tmp,1)==0)
tmp = tmp*10;
kk = kk+1;
end
tmp
tmp =
1.024569999999869e+16 % Gets a lot of floating point garbage
在循环中没有办法知道什么时候四舍五入,因此试图递归地找到有效数字的数量,kk
在这种情况下失败(除非以某种方式设法实现的四舍五入魔术四舍五入而不去掉所需的小数位)。
即使是负数也应该有效:
nDecimalDigit = 9 ;
A = fix( x ) ;
B = round( abs(x-A) * 10^nDecimalDigit ) ;
fix()
函数向零舍入,这将 return 数字的相同整数部分,无论它是负数还是正数(不同于 floor
或 ceil
分别向负无穷大和正无穷大舍入)。
由于A
保留了原来输入的符号,我猜你不需要小数部分的符号B
,所以我们用abs()
取消标志。
我们将这个小数乘以一个因数,具体取决于您要保留的位数,然后我们对 trim 数字中剩余的小数部分进行最后四舍五入。