我在这段代码的输出中得到了很多小数(华氏温度到摄氏温度转换器)。
我的代码目前看起来像这样:
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()
所以我的问题是,如何围绕小数点后第二位的每个答案进行程序化?
答案 0 :(得分:232)
答案 1 :(得分:51)
使用str.format()
的syntax 显示 answer
,带有两个小数位(不改变answer
的基础值):
def printC(answer):
print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer)
其中:
:
介绍了format spec 0
为数字类型启用符号感知零填充.2
将precision设置为2
f
将数字显示为定点数答案 2 :(得分:38)
大多数答案建议round
或format
。 round
有时会向上舍入,在我的情况下,我需要将变量的值向下舍入,而不是仅仅显示。
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库来完成此任务,但我建议的包装器更简单,在某些情况下可能更受欢迎。
答案 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。
答案 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