gpt4 book ai didi

java - 基本转换 : issue with fractions

转载 作者:行者123 更新时间:2023-12-04 05:43:33 26 4
gpt4 key购买 nike

我编写了一个系统,可以将任何基数 (2-36) 转换为另一个整数基数,并且它可以将任何实数从基数 10 转换为任何其他基数 (2-36)。

我的问题是将有理数/无理数从 10 以外的任何基数转换为另一个基数。

我使用以下算法进行小数点右侧的转换:

1)取输入中小数点的右边(0.xxxxxx--->),乘以你要转换的基数。

2)取大于一的数(点的左边),加到转换后的数的右边。

3)取乘积的右边,在下一次重复中使用它作为乘数(乘以基数)

4)重复直到满意或留下一个整数(右侧为0)。

这对于将任何浮点数从十进制转换为另一个基数非常有效,但显然您不能从不是十进制的基数转换。

所以我尝试的是将小数点右边的初始值转换为基数 10,执行数学部分,然后将其转换回原始基数,以便在我将其添加到输出值时(它之前已转换为新基数)正在添加)。

不幸的是,这会返回小数点右侧的错误结果。因此,如果从不是 10 的基数转换而来,我的答案在左侧总是正确的,但在右侧是不正确的。

有没有人对如何使这项工作有任何想法?或者也许它不会?

编辑

或者,任何人都可以链接我/告诉我如何将有理的十六进制值转换为十进制?仅此一项就足以让我解决这个问题。

解决方案

我为将来阅读此问题的任何其他人找到了解决此问题的相当简单的方法。

您所要做的就是取小数点右侧的数字(无论基数如何)并将其转换为十进制数(您可以查看如何转换整数 here )。然后取该数字并将其除以其中的最大位值。例如:

A.C
C == 12 (dec)
12 / 16 = .75 (this is the fractional value in decimal)

然后,您可以采用小数部分并通过我上面讨论的算法运行它。

感谢大家对这个问题的帮助!

最佳答案

使用浮点意味着您不想执行准确的计算。

只有以 2、4、8、16 为底的数字才能在 Java 中准确表示 floating point值(不考虑整数)。这是由于浮点表示的局限性。

只有以 2, 4, 5, 8, 10, 16, 20, 25, 32,... 为基数的数字才能以十进制准确打印。这是由于我们的 decimal number system 的限制.

我希望您因此应该调整一些关于结果舍入的规则,并在整个算法中实现这些规则。确保你舍入而不是截断,否则即使在 double 的精度的情况下,通过浮点也会给你错误的结果。 type 足以满足您的目的,或者可以准确表示数字。

如果您想以更高的精度执行计算,请查看 BigInteger类并专门以整数重新设计您的算法。或者,使用 library用于处理分数;这很有用,因为算法的输入始终可以准确地表示为一个分数。然而,最终它总是归结为定义结果舍入规则并正确实现它们。

编辑 :

  • 正如我从评论中了解到的,您更喜欢在读取整个输入之前逐渐发出输出数字。这基本上是可能的,但是
  • 你需要保持一个区间,而不是一个单一的数字,作为“累加器”;例如,如果您到目前为止已阅读 0.1111在三元中,那么您知道输出位于 0.49382716 之间和 0.50617284在此阶段,您甚至无法发出小数点后的第一个十进制数字。这对于避免看到类似 0.4999999992 的输出是必要的。最“理性”的投入。
  • 当读取完整输入时,“向上舍入”并根据区间的上限而不是下限发出输出更安全。这样0.1111三进制将转换为十进制的 0.5。 (如果您仅限于十六进制到十进制的转换,则可以忽略这一点。)
  • 跟踪输入所达到的最大精度(间隔宽度的对数),并确保您发出的输出数字不超过输入保证的数字。
  • 使用可以安全地处理您需要的最大精度的区间端点(下限和上限)的内部表示。
  • 请记住,即使是非常流行的软件也会偶尔获取此算法的详细信息 wrong并避免以浮点数据类型表示任何中间结果,将输入截断为多个数字,如果它更长,他们可以安全地表示。
  • 您在问题中提到了无理数,但是每个可以用有限(或周期性重复)扩展表示的数字,无论使用何种基数,都必须是有理数。
  • 在从十六进制到十进制的转换中,输出甚至可以始终准确表示,这允许进行一些简化,例如无限期地等待下限和上限收敛。
  • 关于java - 基本转换 : issue with fractions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10972276/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com