C++ 如何更正小数?

C++ 如何更正小数?,c++,C++,如您所见,点之前的数字总是正确的,但小数部分(两种情况除外)总是错误的。(10.5和2是十进制数字和基数,第二个数字是我应该得到的,第三个数字是我得到的)。您对fNum使用固定数字,而不是余数。请注意,在任何情况下,小数部分都相当于12 由于十进制数字通常不能用二进制浮点精确表示,因此您需要确定感兴趣的十进制数字的数量并进行舍入。您需要分别处理整数部分和小数部分。粗略地说,两个部分都必须远离小数点,或者将数字移向小数点。因此,对于整数部分,您需要除以base以将较高有效位移向小数点,而对于小数部

如您所见,点之前的数字总是正确的,但小数部分(两种情况除外)总是错误的。(10.5和2是十进制数字和基数,第二个数字是我应该得到的,第三个数字是我得到的)。

您对
fNum
使用固定数字,而不是余数。请注意,在任何情况下,小数部分都相当于
12


由于十进制数字通常不能用二进制浮点精确表示,因此您需要确定感兴趣的十进制数字的数量并进行舍入。

您需要分别处理整数部分和小数部分。粗略地说,两个部分都必须远离小数点,或者将数字移向小数点。因此,对于整数部分,您需要除以
base
以将较高有效位移向小数点,而对于小数部分,您必须乘以
base
以将较低有效位移向小数点。大致上

10.5 - 1010.1 - 1010.1100   
2      
3.827 - 10.2110222122 - 10.110   
3     
82.7593 - 101.6744681322 - 101.13    
9     
7218.8192 - 5472.90139A8535 - 5472.11    
11     
8273.8 - 26B8.C - 26B8.C    
15     
23517.75 - 5BDD.C - 5BDD.C
16    
92.33271 - 1011100.0101010100 - 1011100.1100
2     
4095.839 - 7777.6554426416 - 7777.14    
8     
29672.9311 - 13033220.3232113021 - 13033220.30    
4     
9999.987 - 270F.FCAC083126 - 270F.C    
16

赋值说明数字最多应该有10个小数。我不知道是否需要舍入(可能是这样),浮点固有的舍入可能会阻止无限位数。@MooingDuck:无限位数是可能的。证明:将.5转换为基数3。转换将乘以3,得到1.5。1成为数字中的一个数字,而.5是在算法中继续的余数。然后将.5乘以3得到下一个数字。结果是“.11111…”,无休止地继续。@EricPostPhischil:好吧,我想是这样的,但我不确定有趣的是,舍入误差的数量有限,而且只能是初始数字。一旦您对一个数字进行乘法和减法运算,减法运算是精确的,并且在有效位中保留一些自由位,以便下一次乘法是精确的,前提是它不会产生一个跨越两个边界的另一次幂的数字。一旦在给定的基数中达到两个可能的最大幂,就不会再有舍入错误。因此,它们不会累积。这意味着前面的数字可能不正确;考虑到之前的情况,后面的是正确的!如果我只是尝试添加一个得到余数的方程式,然后将其发送给ASE,而不是马克评论中提到的固定数字,会更容易吗?或者在这种情况下,这是不可能的?@Blackriar恐怕我不理解你的问题。您已经在
main
中将数字拆分为整数和小数部分。您可以在
toBase
中执行此操作,然后像现在一样处理集成部分,然后
std::cout@blackriar:不,这将不起作用。正如当前编写的那样,
toBase
将整数转换为表示整数所需的位数。它从不产生前导零。但有些分数必须有前导零,例如.0047。因此,即使提取分数部分并将其相乘生成整数,
toBase
也不会将该整数转换为“0047”。如果您修改了
toBase
以根据请求生成前导零,则可以得到一些分数。但是,你需要考虑抑制尾随零点,并决定要产生多少位数。
10.5 - 1010.1 - 1010.1100   
2      
3.827 - 10.2110222122 - 10.110   
3     
82.7593 - 101.6744681322 - 101.13    
9     
7218.8192 - 5472.90139A8535 - 5472.11    
11     
8273.8 - 26B8.C - 26B8.C    
15     
23517.75 - 5BDD.C - 5BDD.C
16    
92.33271 - 1011100.0101010100 - 1011100.1100
2     
4095.839 - 7777.6554426416 - 7777.14    
8     
29672.9311 - 13033220.3232113021 - 13033220.30    
4     
9999.987 - 270F.FCAC083126 - 270F.C    
16
while (not_enough_digits) {
    fractional_part *= base;
    int digit = (int)fractional_part;
    fractional_part -= digit;
    std::cout << x[digit];
}
3*0.827 = 2.481 ~> digit 2
3*0.481 = 1.443 ~> digit 1
3*0.443 = 1.329 ~> digit 1
3*0.329 = 0.987 ~> digit 0
3*0.987 = 2.961 ~> digit 2
3*0.961 = 2.883 ~> digit 2
...

10.211022...