首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >四舍五入数至10

四舍五入数至10
EN

Code Review用户
提问于 2020-04-11 07:02:44
回答 1查看 84关注 0票数 -2

我是个完全的初学者。我从编码bat开始练习,问题是创建一个函数,将3个整数圈到最近的10个,然后找到它们的求和。我想出了一种方法,它在下面的图片中给出了。请帮帮忙。

代码语言:javascript
复制
def round10(num):
       return           # This will return the rounded number 
def sum(a,b,c) 
     return round10(a) + round10(b) + round10(c)
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-04-11 08:08:16

这里有可能破坏类型转换

我注意到您试图以只有字符串和其他可迭代的方式操作整数:len(num)num[0]/num[-1]都会给您一个TypeError。为了防止这种情况发生,首先需要将数字转换为字符串,然后转换为list

代码语言:javascript
复制
def round10(num):
    number = list(str(num))

在网上试试!

但是,另一个问题是不能从字符串中减去整数(再次是TypeError),因此每个列表项都需要转换为整数:

代码语言:javascript
复制
def round10(num):
    number = list(str(number))
    for i in range(len(number)): # Doable because num is a list
        number[i] = int(number[i])

在网上试试!

然后,一旦应用了所有逻辑,就需要将其转换回整数。这意味着您必须将列表转换为单个字符串,并对该字符串调用int()

代码语言:javascript
复制
def round10(num):
    number = list(str(num))
    for i in range(len(number)): # Doable because num is a list
        number[i] = int(number[i])

    if len(number) < 2 and num >= 5:
        number = [1, 0]

    elif len(number) > 2 and number[-1] >= 5:
        number[0] += 1
        number[-1] = 0

    else:
        number[0] -= 1
        number[-1] = 0

    final = ""
    for n in number:
        final += str(n)

    # Here, I'd use final = "".join([str(n) for n in number])

    return int(final)

在网上试试!

如您所见,很有可能混淆所有使用中的类型。

if-statements

中存在逻辑错误

如果你去网上试一试!从上面的函数链接,您将看到您的逻辑存在问题:

  1. 有一个以上数字圆的数字不正确。
  2. 数字10四舍五入为0
  3. 如果最后一个数字小于5,那么这个数字被舍入得太远了。
  4. 非常重要的是:如果一个数字恰好聚集到下一个100(例如599 -> 600),那么这个数字的其余部分就不会增加。

下面是您建议的方法的固定版本,它适用于194以下的数字:

代码语言:javascript
复制
def round10(num):
    number = list(str(num))
    for i in range(len(number)): # Doable because num is a list
        number[i] = int(number[i])

    if len(number) < 2 and num >= 5:
        number = [1, 0]

    elif len(number) >= 2 and number[-1] >= 5:
        number[-2] += 1
        number[-1] = 0

    else:
        number[-1] = 0

    final = ""
    for n in number:
        final += str(n)

    # Here, I'd use final = "".join([str(n) for n in number])

    return int(final)

在网上试试!

更改:

  • elif len(number) > 2 and number[-1] >= 5:已更改为elif len(number) >= 2 and number[-1] >= 5:。这解决了两个或两个以上数字的数字不能正确循环的问题。
  • 我已经将number[0] -= 1else块中删除,以便处理第2点和第3点。

请注意,我还没有解决问题4,这是因为我觉得实现这样一个系统超出了CodingBat挑战的范围。

,那是因为有一种更简单的方法来做这个

实际上,我建议您不要依赖字符串操作,而是使用数学来为您进行舍入。

使用模(%)算子

%运算符返回第一个数除以第二个数的剩余部分。这可以用来查看这个数字离最近的10有多远:

代码语言:javascript
复制
def round10(num):
    distance = num % 10

在网上试试!

然后,如果距离最近的10的距离大于或等于5,只需将10减去这个距离到原来的数字上。否则,从原始数字减去10减去该距离:

代码语言:javascript
复制
def round10(num):
    if num % 10 >= 5: 
        return num + (10 - (num % 10))
    else:
        return num - (10 - (num % 10))

在网上试试!

A小点

我假设CodingBat希望执行求和的函数被称为sum。在这种情况下,你不能真正改变它。但是如果这是在一个适当的程序中,我强烈建议您更改函数名。为什么?为了避免被称为sum的内置函数“掩蔽”(也就是覆盖)。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/240322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档