Float в String без лишнего мусора
- Войдите на сайт для отправки комментариев
Ср, 30/10/2019 - 16:54
Пытаюсь вывести float, используя допустим String(t,1) и получается как то странно при некоторых значениях... не по человечески чтоли:
-0.0
0.0
Вот как можно вывести обычным видом, если 0 то 0. Если 0.000001 то все равно 0, а не 0.0. И так же если -0,0001 то 0, а не -0... и не -0.0
dtostrf делает строку фиксированной длины, что не нужно.
ну если ты задал точность один знак после запятой - то и должно быть 0.0, а не просто 0
А недоволен - то пиши свою функцию с округлением через целый тип
А можно поточнее (желательно, поформальнее) сформулировать что такое "обычный вид". А то у Вас 0.000001 должно быть 0, А, скажем, 0.00001? А 0.0001? А 0.1? Как-то неопределённо всё.
Да и про dtostrf не понял в чём Ваша проблема? Нормально она всё преобразует. Что не так?
Хотя б как сделать чтобы 0 не быль негативным -0.0, ну это же полная чушь
Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?
Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?
он же там предупреждает, что код будет работать только на ЕСП. вроде
На Ардуино sprintf с float не работает
А вот так
https://forum.arduino.cc/index.php?topic=344206.new#new
кто-нибудь делал? (в конце)
ну наверно делал, раз тема такая есть.
Только имейте в виду - на Ардуино нет printf не потому. что кто-то забыл его туда добавить, а потому что у микроконтроллера нет аппаратной поддержки типа float. Любое использование вычислений с плавающей точкой, в том числе и вывод этого типа на печать - весьма и весьма раздувает код.
Значительно эффективнее не использовать printf, а написать вывод чисел с плавающей точкой самому через целые числа.
Да мне кажется, если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному. Я на сторонние ссылки не хожу, может и не понял чего.
А вообще, что за устройство и зачем так делать?
Хотя б как сделать чтобы 0 не быль негативным -0.0, ну это же полная чушь
Я просил Вас дать строгое определение, а не "хотя б".
Кроме того, я Вас спрашивал, что не так с dtostrf?
Ни на один вопрос я ответа не получил. Правильно ли я понимаю, что Вам не нужна помощь? Ну, тогда извините.
Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?
А Вы читали, что автор пишет?
"I seemed to get this to work fine on an ESP32, but on an Arduino, the float, scientific and big number sections were a bit hit and miss"
Что это по-Вашему значит?
На Ардуино sprintf с float не работает
Кто сказал, что не работает?
На ВСЕХ 32-разрядных (Due, stm32...) работает.
...потому что у микроконтроллера нет аппаратной поддержки типа float.
Отнюдь.
Ни у Due, ни у stm32f1xx тоже нет аппаратной поддержки, однако же - работает.
Не работает потому, что в Си типом по умолчанию является double, только в 8-разрядных Ардуинах double имеет 32 разряда, а sprintf ожидает, что в double - 64.
если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?
обычный вывод нецелого числа с одним знаком после запятой 0.0 не думал, что для этого нужно объяснительную. писать )))) они же вокруг нас! Например, не будешь же температуру выводить как 25.98
https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib_1ga060c998e77fb5fc0d3168b3ce8771d42.html
__prec = нужное число знаков после запятой
по кругу ходим... и я получаю фигню вроде -0.0
и вопрос был как этого избежать
А вапще, температуру выводить всегда надо в целых (я всегда так делаю). Как то пофиг, -34 градуса на улице, или -34.25.
IMHO
если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?
Не скажи. У нас тут недавно рыбу варили с невероятной точностью.
Не скажи. У нас тут недавно рыбу варили с невероятной точностью.
Надо ещё и давление показывать при варке рыбы. При низком давлении рыбу можно вообще не сварить.
а что значит .. ?
Другие, пропущенные параметры
Эх, если уж самому писать...
Скажите, а почему "-" не равно '-'?
Потому что один char *, а второй char. Смекаешь?
Ты мне ответь, тебе правда не пофик, 10 градусов на улице, или 10.2?
Смекаешь?
не очень... (
Температура чисто для примера, у меня другой параметр.
Ну тогда для начала дуй в гугал и накрепко изучи строки Си
блин, Sakolua, ну сколько можно воду в ступе толочь?
Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:
напечатает
31.54
и никакой printf не нужен
Не знаю какую ты там воду толочишь, а я такого не спрашивал. Два знака и так без проблем делается по умолчанию системой вообще без настроек.
Два знака и так без проблем делается по умолчанию системой вообще без настроек.
ну так и чего ты тупишь второй день?
Это ты тупишь, иди и почитай первый пост.
А вообще я уже сам все сделал, так что можешь больше не переживать со своей ступой.
А вообще я уже сам все сделал, так что можешь больше не переживать со своей ступой.
Ну похвались. Выложи скетч.
блин, Sakolua, ну сколько можно воду в ступе толочь?
всю жизнь и не можно, а нужно )))
А вообще я уже сам все сделал, так что можешь больше не переживать со своей ступой.
очень интересно, что ж ты там такое наваял? особенно с учетом вопроса о разнице char и char* :))))
Финские учёные разгадали секрет спецэффектов фильма "Матрица"... стреляли из финских пистолетов.
Хотя может быть я ошибаюсь, и ТС вовсе не Финн?
блин, Sakolua, ну сколько можно воду в ступе толочь?
Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:
напечатает
31.54
и никакой printf не нужен
сдаётся мне что это не прокатит - unt dd = ff * 100;
сдаётся мне что это не прокатит - unt dd = ff * 100;
это защита от бездумной копипасты
сдаётся мне что это не прокатит - unt dd = ff * 100;
это защита от бездумной копипасты
в смысле?
Дед как-то подсказывал по краткой записи беззнакового, никак не запомню
uint16_t или uint32_t
uint16_t или uint32_t
это я знаю, думал еще короче )))
word и dword. Короче?
если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?
Не скажи. У нас тут недавно рыбу варили с невероятной точностью.
буквально сегодня клиенту вернул десятичные доли градуса в показаниях СМС, за вопрос зачем - так удобнее видеть не -00, -00.5
хотя да, практической пользы нет.
блин, Sakolua, ну сколько можно воду в ступе толочь?
Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:
напечатает
31.54
и никакой printf не нужен
На счёт проблем, что напечатает если float ff = -0.55 ?
блин, Sakolua, ну сколько можно воду в ступе толочь?
Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:
напечатает
31.54
и никакой printf не нужен
На счёт проблем, что напечатает если float ff = -0.55 ?
Это уже мелочи. Может там и не будет отрицательных чисел. А если будет, то достаточно добавить две строки
d2 тоже имеет знак, поэтому перед выдачей нужно d2=abs(d2);
d2 тоже имеет знак, поэтому перед выдачей нужно d2=abs(d2);
Я не понял, вы заказчик. чтобы требовать тут безошибочного исполнения ТЗ?
Главнаой идеей моего поста был вовсе не код. а то что ТС тупень и спрашивает элементарные вещи :)
Требований не было! Многие для экономии ресурсов котроллера не используют printf(float), а используют аналогичные методы. Идея не нова. Не знаю кто такой "ТС тупень", но можно и повежливей.
Многие для экономии ресурсов котроллера не используют printf(float), а используют аналогичные методы. Идея не нова.
вы не правы, моя идея настолько свежа и оригинальна, что заслуживает нобелевки!
Если Тс - тупень, то вы - зануда :)))
Надо быть проще, бро.
Конечно брю!
Поддерживаю, бра! ))))