如何用Python舍入到2位小数?

时间:2013-12-08 18:13:41

标签: python rounding

我在这段代码的输出中得到了很多小数(华氏温度到摄氏温度转换器)。

我的代码目前看起来像这样:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

所以我的问题是,如何围绕小数点后第二位的每个答案进行程序化?

16 个答案:

答案 0 :(得分:232)

您可以使用round函数,该函数将数字作为第一个参数,第二个参数是精度。

在你的情况下,它将是:

answer = str(round(answer, 2))

答案 1 :(得分:51)

使用str.format()syntax 显示 answer,带有两个小数位(不改变answer的基础值):

def printC(answer):
    print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer)

其中:

  • :介绍了format spec
  • 0为数字类型启用符号感知零填充
  • .2precision设置为2
  • f将数字显示为定点数

答案 2 :(得分:38)

大多数答案建议roundformatround有时会向上舍入,在我的情况下,我需要将变量的向下舍入,而不是仅仅显示。

round(2.357, 2)  # -> 2.36

我在这里找到答案:How do I round a floating point number up to a certain decimal place?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

或:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

答案 3 :(得分:10)

float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

答案 4 :(得分:8)

如果在舍入数字时需要避免浮点问题,可以使用numpy舍入。

您需要安装numpy:

import UIKit
import Firebase

class MessageController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()



        var ref: DatabaseReference!
        ref = Database.database().reference()


        let userID = Auth.auth().currentUser?.uid
        ref.child("users/profile").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in

            print(snapshot)
            if let dictionary = snapshot.value as? [String: AnyObject] {
//            self.navigationItem.title = dictionary["username"] as? String

                let user = User()
                user.setValuesForKeys(dictionary)
                self.setUpNavBar(user: user)

            }
        }, withCancel: nil)

    }

    func setUpNavBar(user: User) {
        let titleView = UIView()

        titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
        titleView.backgroundColor = UIColor.red

        let containerView = UIView()
        containerView.translatesAutoresizingMaskIntoConstraints = false
        titleView.addSubview(containerView)

        let profileImageView = UIImageView()
        profileImageView.translatesAutoresizingMaskIntoConstraints = false
        profileImageView.contentMode = .scaleAspectFill
        profileImageView.layer.cornerRadius = 20
        profileImageView.clipsToBounds = true
        if let profileImageUrl = user.photoURL {
            profileImageView.loadImageUsingCacheWithURLString(urlString: profileImageUrl)
        }
        containerView.addSubview(profileImageView)

        profileImageView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
        profileImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
        profileImageView.widthAnchor.constraint(equalToConstant: 40).isActive = true
        profileImageView.heightAnchor.constraint(equalToConstant: 40).isActive = true


        let nameLabel = UILabel()

        containerView.addSubview(nameLabel)
        nameLabel.text = user.username
        nameLabel.translatesAutoresizingMaskIntoConstraints = false
        nameLabel.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 8).isActive = true
        nameLabel.centerYAnchor.constraint(equalTo: profileImageView.centerYAnchor).isActive = true

        nameLabel.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
        nameLabel.heightAnchor.constraint(equalTo: profileImageView.heightAnchor).isActive = true

        containerView.centerXAnchor.constraint(equalTo: titleView.centerXAnchor).isActive = true
        containerView.centerYAnchor.constraint(equalTo: titleView.centerYAnchor).isActive = true

        self.navigationItem.titleView = titleView

        titleView.isUserInteractionEnabled = true

        let mytapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(showChatController))
        mytapGestureRecognizer.numberOfTapsRequired = 1
        titleView.addGestureRecognizer(mytapGestureRecognizer)
    }

    @objc func showChatController() {
        print("clicked")
//        let chatLogController = ChatLogController()
//        navigationController?.pushViewController(chatLogController, animated: true)

    }

和代码:

pip install numpy

打印

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

如果您通过合法的四舍五入管理资金,则应该使用它。

答案 5 :(得分:8)

如果只想打印出四舍五入的结果,则可以使用自Python 3.6以来引入的f-strings。语法与str.format()format string syntax相同,不同之处在于,您在文字字符串的前面放置了f,并将变量直接放在花括号内的字符串中。

.2f表示四舍五入到小数点后两位:

number = 3.1415926
print(f"The number rounded to two decimal places is {number:.2f}")

输出:

The number rounded to two decimal places is 3.14

答案 6 :(得分:5)

只需使用%。2f格式,即可向下舍入到2位小数。

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

答案 7 :(得分:3)

您可以使用python“%”的字符串格式化运算符。 “%。2f”表示小数点后的2位数。

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting

答案 8 :(得分:3)

你想要回答你的答案。

round(value,significantDigit)是执行此操作的普通解决方案,但是这个 有时候 不能像数学视角下的数学视角那样运作在您要求舍入的数字左侧有一个5

以下是这种不可预测行为的一些例子:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

假设您的意图是对科学中的统计数据进行传统舍入,这是一个方便的包装器,可以使round函数按预期工作,需要import额外的内容,例如Decimal

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

啊哈!所以基于此,我们可以创建一个函数......

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1))

基本上,这会为字符串添加一个非常小的值,以强制它在不可预测的实例上正确地向上舍入,而在预期的情况下,它通常不会使用round函数。要添加的便捷值是1e-X,其中X是您尝试在加号round上使用1的数字字符串的长度。

使用10**(-len(val)-1)的方法是故意的,因为它是您可以添加的最大小数字以强制转换,同时还确保您添加的值永远不会更改舍入,即使小数.不见了。我可以使用10**(-len(val))与条件if (val>1)一起减去1更多......但更简单的是总是减去1因为赢了&#39 ; t改变了这个变通方法可以正确处理的十进制数的适用范围。如果您的值达到类型的限制,此方法将失败,这将失败,但对于几乎整个有效小数值范围,它应该有效。

所以完成的代码将是:

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

...应该给你预期的结果。

您也可以使用decimal库来完成此任务,但我建议的包装器更简单,在某些情况下可能更受欢迎。

修改:感谢Blckknght指出5边缘情况仅针对特定值here发生。

答案 9 :(得分:1)

您可以使用圆形功能。

round(80.23456, 3)

会给你答案80.234

在您的情况下,请使用

answer = str(round(answer, 2))

希望这会有所帮助:)

答案 10 :(得分:1)

以下是我使用的示例:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

答案 11 :(得分:1)

不确定原因,但是' {:0.2f}' .format(0.5357706)给了我' 0.54'。 唯一适用于我的解决方案(python 3.6)如下:

GROUP BY

答案 12 :(得分:1)

您可以使用舍入运算符最多2个小数位

a.It shows some empty space below the input box
b.ScrollView is reset to the top of the page after I moving to the next input box

答案 13 :(得分:1)

如果不仅需要取整结果,还需要对取整结果进行数学运算,则可以使用decimal.Decimal https://docs.python.org/2/library/decimal.html

from decimal import Decimal, ROUND_DOWN

Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32') 

答案 14 :(得分:0)

如您所希望的答案为十进制数,因此您无需在printC()函数中将答案变量强制转换为str。

然后使用printf-style String Formatting

答案 15 :(得分:0)

为了避免 round() 产生令人惊讶的价值,这是我的方法:

Round = lambda x, n: eval('"%.'+str(int(n))+'f" % '+repr(int(x)+round(float('.'+str(float(x)).split('.')[1]),n)))

print(Round(2, 2))       # 2.00
print(Round(2.675, 2))   # 2.68