deepdiff
deepdiff copied to clipboard
Compare int with float values fail with number_format_notation='e' and ignore_nummeric_type_changes=True
Describe the bug Comparing values of type int and float based on the settings: number_format_notation='e' ignore_numeric_type_changes=True fail on compares like. key=41 with key=41.0. Does not happen with settings: number_format_notation='f' ignore_numeric_type_changes=True
To Reproduce Steps to reproduce the behavior:
- Run the code:
from deepdiff.diff import DeepDiff
d1 = {'a': int(41)}
d2 = {'a': float(41)}
DeepDiff(d1, d2, number_format_notation='e', ignore_numeric_type_changes=True)
DeepDiff(d1, d2, number_format_notation='f', ignore_numeric_type_changes=True)
- Results shown:
{'values_changed': {"root['a']": {'new_value': 41.0, 'old_value': 41}}}
{}
Expected behavior Expect that number_float_notation should not have any impact.
Analysis I did some debugging and found that in source: diff.py, function: __diff_numbers() the results of number_to_string() are (using 6 significant_digits):
t1_s = 4.100000e+04 t2_s = 4.100000e+4
In function: number_to_string() source: helper.py near end the following is listed:
if number_format_notation == 'e' and isinstance(number, float):
result = result.replace('+0', '+')
I think that also for type int the correction has to be executed or only skipped for type Decimal. So solution might be:
if number_format_notation == 'e' and not isinstance(number, Decimal):
result = result.replace('+0', '+')
OS, DeepDiff version and Python version (please complete the following information):
- OS: Win 10 Pro 64-bit
- Version python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)]'
- Version deepdiff 4.3.0
Hi @eremmel Thanks for reporting the issue. I will look into it asap.