Skip to content

Commit 40bbb6b

Browse files
Merge pull request RustPython#1551 from ChJR/feature/float-repr
Fix float.__repr__()
2 parents e8bb4bb + 814018f commit 40bbb6b

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

tests/snippets/floats.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,14 @@
289289
assert float('nan').__ne__(float('nan')) is True
290290
assert float('nan').__eq__(float('inf')) is False
291291
assert float('nan').__ne__(float('inf')) is True
292+
293+
assert float(1e15).__repr__() == "1000000000000000.0"
294+
assert float(1e16).__repr__() == "1e+16"
295+
assert float(1e308).__repr__() == "1e+308"
296+
assert float(1e309).__repr__() == "inf"
297+
assert float(1e-323).__repr__() == "1e-323"
298+
assert float(1e-324).__repr__() == "0.0"
299+
assert float(1e-5).__repr__() == "1e-05"
300+
assert float(1e-4).__repr__() == "0.0001"
301+
assert float(1.2345678901234567890).__repr__() == "1.2345678901234567"
302+
assert float(1.2345678901234567890e308).__repr__() == "1.2345678901234567e+308"

vm/src/obj/objfloat.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,20 @@ impl PyFloat {
416416

417417
#[pymethod(name = "__repr__")]
418418
fn repr(&self, vm: &VirtualMachine) -> String {
419-
if self.is_integer(vm) {
420-
format!("{:.1?}", self.value)
419+
let value = format!("{:e}", self.value);
420+
if let Some(position) = value.find('e') {
421+
let significand = &value[..position];
422+
let exponent = &value[position + 1..];
423+
let exponent = exponent.parse::<i32>().unwrap();
424+
if exponent < 16 && exponent > -5 {
425+
if self.is_integer(vm) {
426+
format!("{:.1?}", self.value)
427+
} else {
428+
self.value.to_string()
429+
}
430+
} else {
431+
format!("{}e{:+#03}", significand, exponent)
432+
}
421433
} else {
422434
self.value.to_string()
423435
}

0 commit comments

Comments
 (0)