This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.0 in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit 853313bd14adcca16779a0fed8963ff28384ca0e Author: Pxl <[email protected]> AuthorDate: Tue Mar 8 18:58:52 2022 +0800 [fix](vectorized) fix float to string inaccurate (#8392) --- be/src/vec/data_types/data_type_number_base.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/be/src/vec/data_types/data_type_number_base.cpp b/be/src/vec/data_types/data_type_number_base.cpp index be86d95..e828c83 100644 --- a/be/src/vec/data_types/data_type_number_base.cpp +++ b/be/src/vec/data_types/data_type_number_base.cpp @@ -23,6 +23,7 @@ #include <type_traits> #include "gen_cpp/data.pb.h" +#include "gutil/strings/numbers.h" #include "vec/columns/column_const.h" #include "vec/columns/column_vector.h" #include "vec/common/assert_cast.h" @@ -40,6 +41,16 @@ void DataTypeNumberBase<T>::to_string(const IColumn& column, size_t row_num, assert_cast<const ColumnVector<T>&>(*column.convert_to_full_column_if_const().get()) .get_data()[row_num]); ostr.write(hex.data(), hex.size()); + } else if constexpr (std::is_same_v<T, float>) { + // fmt::format_to maybe get inaccurate results at float type, so we use gutil implement. + char buf[MAX_FLOAT_STR_LENGTH + 2]; + + int len = FloatToBuffer( + assert_cast<const ColumnVector<T>&>(*column.convert_to_full_column_if_const().get()) + .get_data()[row_num], + MAX_FLOAT_STR_LENGTH + 2, buf); + + ostr.write(buf, len); } else if constexpr (std::is_integral<T>::value || std::numeric_limits<T>::is_iec559) { ostr.write_number( assert_cast<const ColumnVector<T>&>(*column.convert_to_full_column_if_const().get()) @@ -79,8 +90,7 @@ char* DataTypeNumberBase<T>::serialize(const IColumn& column, char* buf) const { buf += sizeof(uint32_t); // column data auto ptr = column.convert_to_full_column_if_const(); - const auto* origin_data = - assert_cast<const ColumnVector<T>&>(*ptr.get()).get_data().data(); + const auto* origin_data = assert_cast<const ColumnVector<T>&>(*ptr.get()).get_data().data(); memcpy(buf, origin_data, column_num * sizeof(FieldType)); buf += column_num * sizeof(FieldType); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
