📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 5849| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Python/Perl] python的负数整除问题。

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
PYTHON负数除法。用'//'符号进行除法的话。自动向下取整。但是其他语言好像都是向上取整?
比如
python 5//-3 == -2
java      5//-3 == -1 ?
那么问题来了。python中使用int( 5 / -3 ) == -1  就可以完全和其他语言统一了吗?向上取整

上一篇:求推荐巩固算法的书籍或者网站。
下一篇:西雅图downtown的朋友一般在哪刷题呢?
推荐
kuboy 2019-7-17 09:07:38 | 只看该作者
全局:
各种语言都有自己的定义吧,python中:
int(),向 0 取整。

round(),银行进位法,四舍六入五取偶。
>>> round(-2.5), round(-1.5), round(1.5), round(2.5)
-2 -2 2 2

math.floor(),向下取整,找大的。

math.ceil(),向上取整,找小的。

斜杠 / ,总是返回一个浮点数。

双斜杠// ,地板除 ,只保留整数部分,向下取整。得到的并不一定都是整数类型的数,它与分母分子的数据类型有关系,如果分子或分母有浮点型,结果就是浮点型

>>> -2.5//2, -1.5//2, 1.5//2, 2.5//2
           -2.0       -1.0          0.0          1.0

补充内容 (2019-7-18 09:06):
有点错误,向下取整是取小向上取整是取大,如 math.floor(-2.5) 向下取整是 -3 ,math.ceil(-2.5) 向上取整是 -2,地板除 // 是只要结果为正数,就保留整数部分结果是负数,就向下取整,如 -2.5//2 结果是 -2.0

评分

参与人数 4大米 +6 收起 理由
thunder + 2 很有用的信息!
onelittletiger + 1 赞一个
ncy + 1 赞一个
jane19930412 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
我觉得不行吧,5/-3还是一个整数,对它进行int也不会返回-1
或者你试试int(float(5)/-3)

我在Stackoverflow上找到的解释:
https://stackoverflow.com/questi ... -by-negative-number
回复

使用道具 举报

🔗
eagleoflqj 2019-7-17 09:13:14 | 只看该作者
全局:
def f(a,b):
    return (1 if a*b>0 else -1)*(abs(a)//abs(b))

评分

参与人数 1大米 +1 收起 理由
helloworld27 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| whodatj 2019-7-17 09:43:56 | 只看该作者
全局:
imagebreaker 发表于 2019-7-17 08:06
我觉得不行吧,5/-3还是一个整数,对它进行int也不会返回-1
或者你试试int(float(5)/-3)

int(5/-3)就是-1阿
回复

使用道具 举报

🔗
337845818 2019-7-17 21:49:07 | 只看该作者
全局:
回复

使用道具 举报

全局:
imagebreaker 发表于 2019-7-17 08:06
我觉得不行吧,5/-3还是一个整数,对它进行int也不会返回-1
或者你试试int(float(5)/-3)

python2里面 5/-3是整数,但是python3里面不是。。。。
回复

使用道具 举报

🔗
helloworld27 2019-7-18 08:16:18 | 只看该作者
全局:
整数计算中加入浮点运算容易出现浮点误差。假如运算结果特别大,可能会出问题。可以试试这个:

  1. def divide(a, b):
  2.   return (a - a%abs(b))//b if a > 0 else (a + a%abs(b))//b
复制代码


简单测试了一下没有问题:

  1. for i in range(-3, 4):
  2.   for j in range(-3, 4):
  3.     if j != 0:
  4.       print("%d\t%d\t%d\t" % (i, j, divide(i, j)))
复制代码

  1. public class Main {
  2.     public static void main(String[] args) {
  3.         for (int i = -3; i <= 3; i++)
  4.           for (int j = -3; j <= 3; j++)
  5.             if (j != 0)
  6.               System.out.println("" + i + "\t" + j + "\t" + i/j);
  7.     }

  8. }
复制代码


P.S. 楼上的代码似乎更简洁
回复

使用道具 举报

🔗
jaychsu 2019-7-18 17:31:04 | 只看该作者
全局:
前面的都太麻烦,这个有个优雅又 tricky 的做法

  1. -1 * -3 // 2 * -1  # -1
  2. -1 * 3 // -2 * -1  # -1
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表